流程控制

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的小节再详解介绍。