今天继续学习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 会随机公平地选出一个执行,其他不会执行。
否则:
- 如果有 default 子句,则执行该语句。
- 如果没有 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天.