go控制流
1. if-else
if-else
代码块语法如下:判断条件Condition
前可包含初始化语句,如果初始化语句为空,则;
可以去掉。Condition
表达式的结果必须是布尔类型。如果Condition
为true
,则执行if
分支的代码块,否则执行else
分支的代码块。else
后可立即跟随一个if-else
语句。
if InitSimpleStatement; Condition {
// do something
} else {
// do something
}
下面例子通过rand.Int()
随机生成一个整数n
,判断n
除以3的余数。
package main
import (
"fmt"
"math/rand"
)
func main() {
if n := rand.Int(); n%3 == 0 {
fmt.Printf("\n%d mod 3 is zero", n)
} else if n%3 == 1 {
fmt.Printf("\n%d mod 3 is 1", n)
} else {
fmt.Printf("\n%d mod 3 is 2", n)
}
}
2. for循环
for
循环的语法如下,和if-else
一样,Condition
表达式的结果必须是布尔类型。如果Condition
为true,则循环继续;否则循环结束。
for InitSimpleStatement; Condition; PostSimpleStatement {
// do something
}
InitSimpleStatement
在第一次循环之前执行一次,Condition
每次循环都进行判断,PostSimpleStatement
每次循环结束时执行一次。
go 没有while
关键字,但可以通过for
实现while
的功能。
n := 1
for n < 5 {
n *= 2
}
fmt.Println(n) // 8 (1*2*2*2)
/无限循环
sum := 0
for {
sum++ // repeated forever
}
fmt.Println(sum) // never reached
go 通过for range
来实现其他语言foreach
的功能,实现对 slices、maps 等的遍历。
strings := []string{"hello", "world"}
for i, s := range strings {
fmt.Println(i, s)
}
和其他语言一样,go 提供了break
和continue
两个关键字来控制for
循环。
break
跳出最近的for
、switch
和select
。continue
继续最近的for
循环的下一次迭代。
3. switch-case
switch-case
基础语法如下,它相当于多个if-else
语句的组合。
switch optstatement; optexpression{
case expression1: Statement..
case expression2: Statement..
...
default: Statement..
}
optstatement
可选,它支持变量声明、赋值、函数调用等。在此声明的变量的作用域为switch
代码块,详见变量作用域。- 和其他语言不同,go 只会运行命中的
case
,不需要显示的使用break
。如果希望继续执行后面的case
,需要使用fallthrough
。
package main
import (
"fmt"
"math/rand"
)
func main() {
switch n := rand.Intn(10) % 3; n + 1 {
case 1:
fmt.Println("n is 1")
case 2:
fmt.Println("n is 2")
fallthrough
case 3:
fmt.Println("n is 3")
}
}
提示
fallthrough
不能出现在最后一个分支语句里,同时只能是分支语句里的最后一条语句。
4. goto语句
go 支持goto
语句,goto
语句允许无条件的跳转到函数里的某个标签。在一些场景里(例如错误处理),使用goto
会让代码变得更清晰。
package main
func main() {
println("start")
goto LABEL
println("end")//不会执行
LABEL:
println("in label")
}
标签有对应的作用域,作用域之外,goto
无法跳转到该标签。下面的代码无法通过编译。
package main
func main() {
println("start")
goto LABEL
for a := 0; a < 10; a++ {
LABEL:
println("in label")
}
}
使用goto
可以实现for
的功能,例如:
package main
func main() {
x := 0
NEXT:
if x < 5 {
println(x)
x++
goto NEXT
}
}
除了goto
可以和标签搭配使用外,break
和continue
也可以和标签搭配使用,不过有一些限制:
break
标签必须对应包含break
的可中断的语句(for
或者switch
)。continue
标签必须对应包含continue
的for
语句。