go快速入门(2) | 青训营笔记

63 阅读1分钟

今天继续学习go的基础语法——变量、运算符与选择语句

变量

go语言的变量与C基本一致,常见的float在声明时候为float32、float64
int默认为int ,也就是 int64 ,此外还可以声明为int8,int16,int32
uint 默认为 uint,uint64 ,此外还可以声明为uint8,uint16,uint3

变量的声明,与C有区别:
可以一次声明单个或者多个,形式如下:

var identifier type
var identifier1, identifier2 type

比如:

var a float32

此外,还可以用 := 或者直接初始化

a:= 123.34
var a = 123.34

系统根据形式分配默认的类型,这里分配float32

常见的变量声明:
(未初始化,默认为0 或者 nil (空))

func main() {
    var i int
    var f float64
    var b bool
    var s string
    fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

也有C含有的引用类型
&i 来获取变量 i 的内存地址
引用类型的变量存储的是值所在的内存地址,这个内存地址也就是指针。

var i = 12
var j *int
j = &i 

运算符

与C基本保持一致,也有自增++ 和 自减 -- ,此外还有关系运算符(>,!=......)逻辑运算符(&&,||....)、位运算符(^,&,|......),赋值运算符(+=,%=......)

但是注意的是没有三目运算符,比如:

a>j?a:b

在go语言中没有这种表示

条件语句

if...else..成立,但是要注意,他这个格式,else if 或者 else 要跟在if或者else if 条件判断后} 的后面,保持同一行,譬如:

package main
​
import "fmt"func main() {
    var age int = 22
    if age <= 25 {
        fmt.Println("true")
    } else if age < 25 {
        fmt.Println("too small")
    } else {
        fmt.Println("too big")
    }
}

此外,还有switch

另外,还支持了select ,select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。

需要符合以下条件:

  • 每个 case 都是一个通道
  • channel 表达式、被发送的表达式都会被求值
  • 如果任意某个通道可以进行,它就执行,其他被忽略。
  • 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。 否则:
    1. 如果有 default 子句,则执行该语句。
    2. 如果没有 default 子句,select 将阻塞,直到某个通道可以运行;Go 不会重新对 channel 或值进行求值。
package main
​
import (
    "fmt"
    "time"
)
func main() {
    c1 := make(chan string)
    c2 := make(chan string)
    go func() {
        time.Sleep(1 * time.Second)//跟python很像,停止1s
        c1 <- "one"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "two"
    }()
    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}

结果:

received one
received two

以上实例中,我们创建了两个通道 c1 和 c2。 select 语句等待两个通道的数据。如果接收到 c1 的数据,就会打印 "received one";如果接收到 c2 的数据,就会打印 "received two"。

了解更多请看:www.runoob.com/go/go-selec…\

“这是我参与「第五届青训营 」笔记创作活动的第2天.