go的流程控制语句很有特色。if-else,for,switch-case。注意go没有while和do-while语句。除此之外go还有和特定类型绑定的流程控制模块。例如,用于容器类型的for-range循环。 go支持break,continue以及goto语句,另外go还支持特有的fallthrough语句。
go语言中的if-else语句格式如下:
if InitSimpleStatement; Condition {
// do something
} else {
// do something
}
需要对一下几点进行说明。
const a = 10
if a{ // condition的结果必须是布尔值。
} else {
}
Go中有六种简单语句类型:
if x{ // condition的结果必须是布尔值。
//do
} else if y{
//do
}else{
//do
}
在go语言中,for循环形式如下所示:
for InitSimpleStatement; Condition; PostSimpleStatement {
// do something
}
go中没有while和do-while,循环只能使用for来解决。因此,它具备以下几个特点。
for ; true; {
}
for true {
}
for ; ; {
}
for {
}
比如下面的代码打印出012,而不是0。
for i := 0; i < 3; i++ {
fmt.Print(i)
i := i // 这里声明的变量i遮挡了上面声明的i。
// 右边的i为上面声明的循环变量i。
i = 10 // 新声明的i被更改了。
_ = i
}
break语句可以用来提前跳出包含此break语句的最内层for循环。 break可以使用在一个switch-case流程控制的任何分支代码块之中以提前跳出此switch-case流程控制。
continue语句可以被用来提前结束包含此continue语句的最内层for循环的当前循环步。
go中的switch-case语句完整形式如下:
switch InitSimpleStatement; CompareOperand0 {
case CompareOperandList1:
// do something
case CompareOperandList2:
// do something
...
case CompareOperandListN:
// do something
default:
// do something
}
一个switch-case流程控制的例子:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
switch n := rand.Intn(100); n%9 {
case 0:
fmt.Println(n, "is a multiple of 9.")
// 和很多其它语言不一样,程序不会自动从一个
// 分支代码块跳到下一个分支代码块去执行。
// 所以,这里不需要一个break语句。
case 1, 2, 3:
fmt.Println(n, "mod 9 is 1, 2 or 3.")
break // 这里的break语句可有可无的,效果
// 是一样的。执行不会跳到下一个分支。
case 4, 5, 6:
fmt.Println(n, "mod 9 is 4, 5 or 6.")
// case 6, 7, 8:
// 上一行可能编译不过,因为6和上一个case中的
// 6重复了。是否能编译通过取决于具体编译器实现。
default:
fmt.Println(n, "mod 9 is 7 or 8.")
}
}
如果你想要C/C++中switch语句在不使用break语句的情况下的效果,可以使用fallthrough语句来实现。
比如,下面代码的几个fallthrough使用是不合法的。
switch n := rand.Intn(100) % 5; n {
case 0, 1, 2, 3, 4:
fmt.Println("n =", n)
// 此整个if代码块为当前分支中的最后一条语句
if true {
fallthrough // error: 不是当前分支中的最后一条语句
}
case 5, 6, 7, 8:
n := 99
fallthrough // error: 不是当前分支中的最后一条语句
_ = n
default:
fmt.Println(n)
fallthrough // error: 不能出现在最后一个分支中
}
一个switch-case流程控制中的InitSimpleStatement语句和CompareOperand0表达式都是可选的。 如果CompareOperand0表达式被省略,则它被认为类型为bool类型的true值。 如果InitSimpleStatement语句被省略,其后的分号也可一并被省略。
https://gfw.go101.org/article/control-flows.html
https://learnku.com/docs/the-way-to-go/chapter-description/3591