跳到主要内容

go控制流

1. if-else

if-else代码块语法如下:判断条件Condition前可包含初始化语句,如果初始化语句为空,则;可以去掉。Condition表达式的结果必须是布尔类型。如果Conditiontrue,则执行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的功能,实现对 slicesmaps 等的遍历。

strings := []string{"hello", "world"}
for i, s := range strings {
fmt.Println(i, s)
}

 和其他语言一样,go 提供了breakcontinue两个关键字来控制for循环。

  1. break跳出最近的forswitchselect
  2. continue继续最近的for循环的下一次迭代。

3. switch-case

switch-case基础语法如下,它相当于多个if-else语句的组合。

switch optstatement; optexpression{
case expression1: Statement..
case expression2: Statement..
...
default: Statement..
}
  1. optstatement可选,它支持变量声明、赋值、函数调用等。在此声明的变量的作用域为switch代码块,详见变量作用域
  2. 和其他语言不同,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可以和标签搭配使用外,breakcontinue也可以和标签搭配使用,不过有一些限制:

  1. break标签必须对应包含break的可中断的语句(for或者switch)。
  2. continue标签必须对应包含continuefor语句。

  1. Basic Control Flows

  2. 5 basic for loop patterns

  3. Switch Statement in Go

署名-非商业性使用-禁止演绎 4.0 国际