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语句。