05 流程控制
05 流程控制
这个控制流在各个语言都是写的最多的,在 Go 中,用于控制流程的操作和 cpp 基本上完全一致,这里我们挑重点说。
if
首先在语法上,Go 的 if 语句对条件语句不需要加上小括号:
score := 65
if score > 90 {
println(666)
} else if score > 70 {
println("just so so")
} else {
println("too low")
}
其中,与 cpp 的条件初始化的特性相同,变量的定义也可以放到条件语句处,此处 只能使用短变量声明,因此上面的例子可以修改为:
if score := 65; score > 90 {
...
}
for
Go 中没有 while 的关键字,所有的循环操作均由 for 这个关键字完成,首先看一下最基本的用法:
for i := 0; i < 10; i++ {
print(i, " ")
}
其中,初始化语句可以不写,这一点和 cpp 依旧一致,如果想实现类似 while 的效果你可能已经想到了,使用类似 for ;exp; {}
这样的东西来实现,但是 Go 其实贴心的为我们做了这一点,我们无需写这两个分号即可:
i := 10
for i < 20 {
print(i, " ")
i++
}
那如果想表示无限循环呢,你又想到了,我直接写一个 for ;; {}
不就好了,然后保存发现,插件自动把你的两个分号给格掉了,hh,所以无限循环其实可以这样写:
i := 10
for {
if i >= 20 {
break
}
i++
}
除此以外,for 还有一个键值循环的写法,也就是上一节中我们展示 rune 的时候用到的写法,它的作用是这样的: 当我们写了 range exp 后,他会分解这个exp,一般情况下分解为 index、val,对于 map 则会分解为 key、value,通道则只会分解出来值,随后把分解的内容赋给我们指定的变量:
str := "hello, world"
for index, val := range str {
fmt.Printf("%d, %c\n", index, val)
}
switch
与 c 风格的switch不同的是,Go 的 switch 默认是不会出现穿透的情况的,因此在写 case 时不用再一个一个手写 break 了!
extern_name := ".a"
switch extern_name {
case ".html":
println("html")
case ".so":
println("so")
default:
println("no")
}
再来说一个,如果我们多个 case 出现的结果是一样的,在 c 中是不是 case x1: case x2: ...
这样呢,而在 Go 中,我们只需要用 ,
分割即可:
switch n := 2; n {
case 1, 3, 5, 7, 9:
println("奇数")
case 2, 4, 6, 8, 10:
println("偶数")
default:
println(n)
}
再来一个,如果我想要的是一个 case 表示一个范围呢,好像标准版本不支持这样写对吧,唯一一个沾边的还是 gcc 编译器提出的扩展写法,但是在 go 中,这个很容易就可以做到:
switch age := 65; {
case age < 25:
fmt.Println("好好学习吧!")
case age > 25 && age <= 60:
fmt.Println("好好工作吧!")
case age > 60:
fmt.Println("好好享受吧!")
default:
fmt.Println("活着真好!")
}
最后一个,如果说 c 中的穿透是我们正好需要的情况呢,Go 也提供了 fallthrough 这个关键字来实现类似的效果,它默认只会穿透一层:
switch str := "a"; str {
case "a":
println("a")
fallthrough
case "b":
println("b")
fallthrough
default:
println("c")
}
break
这个关键字的作用是跳出当前这层循环结构,不过在 Go 中它多了一个标签的机制,有点类似于 goto,可以指定跳出哪层循环,先看下面的例子:
label:
for i := range 2 {
for j := range 10 {
if j == 2 {
break label
}
println(i, j)
}
println("-----")
}
如果不加标签,按理说执行到第 5 行,他就会跳出内层循环,然后去继续执行第 9 行的内容,但是加上标签后他会终止被标记的这层循环。
continue
这个与 break 相同,也是多了个 label 的机制,看个例子就好:
here:
for i := range 2 {
for j := range 10 {
if j == 2 {
continue here
}
println(i, j)
}
}