流程控制

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中还有一个特殊的控制结构叫selectselect需要和channel配置使用,我们在channel的小节再详解介绍。