流程控制
if-else
golang中 if-else有如下几种结构
if 条件 {
//代码
}
if 条件 {
//代码
} else {
//代码
}
if 条件1 {
//代码
} else if 条件2 {
//代码
}else {
//代码
}
switch
golang的switch
条件控制比较强大,有如下几种方式
switch 变量
方式
switch 变量 {
case 值1:
//代码
case 值2:
//代码
default:
//代码
}
var1 :=0
switch var1 {
case 1:
fmt.Println(1)
case 0:
fmt.Println(0)
default:
fmt.Println("default")
}
switch 变量 {
case 值1,值2: //case 后可以支持多个值做测试,多个值使用`,`分割
//代码
case 值3:
//代码
default:
//代码
}
var1 :=99
switch var1 {
case 98,99,100:
fmt.Println("more than 97")
case 0:
fmt.Println(0)
default:
fmt.Println("other")
}
Go里面switch默认的情况下每个case最后都会break
,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是golang支持fallthrough
强制执行下一个case的代码。
switch val {
case 0: fallthrough
case 1:
func1() //i == 0 时函数也会被执行
}
switch
不带变量方式,在case 分支使用条件判断语句
switch {
case 条件1:
//代码
case 条件2:
//代码
default:
//代码
}
i :=99
switch {
case i < 0:
fmt.Println("le 0")
case i == 0:
fmt.Println("eq 0")
case i > 0:
fmt.Println("lg 0")
}
for
在golang中for控制结构是最灵活的。在for循环体重break
可以退出循环,continue
可以忽略本次循环未执行的代码跳入下次循环。
正统的for结构
for 初始化语句; 条件语句; 修饰语句 {
}
for i := 0; i < 10; i++ {
if i==3 {
continue //不打印3
}
fmt.Println(i)
}
类似 while
结构
for 条件 {
}
i:=10
for i >= 0 {
i -= 1
fmt.Println(i)
}
无限循环
for{
//代码
}
i :=10
for{
i-=1
if i == 0 {
break //使用break退出无限循环
}
}
for-range 结构
在golang中 for range
比仅仅可以遍历 数组,切片,map 还可以变量 带缓存的channel
arr :=[]int{1,3,3}
for i, v := range myMap {
fmt.Printf("index:%d value:%d \n", i, v)
}
myMap := map[string]int{
"a": 1,
"b": 2,
}
for k, v := range myMap {
fmt.Printf("key:%s value:%d \n", k, v)
}
channels := make(chan int, 10)
go func() {
for {
channels <- 1
time.Sleep(1e9)
}
}()
for v := range channels { //当channels的缓存队列为空会阻塞
fmt.Println(v)
}
select 结构
在golang中还有一个特殊的控制结构叫select
,select
需要和channel配置使用,我们在channel的小节再详解介绍。