Go循環控制
在 Go 中,有僅有一種循環語句:for,Go 拋棄了while語句,for語句可以被當作while來使用。
for
語句格式如下
go
for init statement; expression; post statement {
execute statement
}當只保留循環條件時,就變成了while。
go
for expression {
execute statement
}這是一個死循環,永遠也不會退出
go
for {
execute statement
}示例
這是一段輸出[0,20]區間數字的代碼
go
for i := 0; i <= 20; i++ {
fmt.Println(i)
}你可以同時初始化多個變量,然後將其遞增
go
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
fmt.Println(i, j)
}當成while來使用
go
num := 1
for num < 100 {
num *= 2
}雙循環打印九九乘法表,這是一個很經典的循環案例
go
func main() {
for i := 1; i <= 9; i++ {
for j := 1; j <= 9; j++ {
if i <= j {
fmt.Printf("%d*%d = %2d ", i, j, i*j)
}
}
fmt.Println()
}
}輸出如下
go
1*1 = 1 1*2 = 2 1*3 = 3 1*4 = 4 1*5 = 5 1*6 = 6 1*7 = 7 1*8 = 8 1*9 = 9
2*2 = 4 2*3 = 6 2*4 = 8 2*5 = 10 2*6 = 12 2*7 = 14 2*8 = 16 2*9 = 18
3*3 = 9 3*4 = 12 3*5 = 15 3*6 = 18 3*7 = 21 3*8 = 24 3*9 = 27
4*4 = 16 4*5 = 20 4*6 = 24 4*7 = 28 4*8 = 32 4*9 = 36
5*5 = 25 5*6 = 30 5*7 = 35 5*8 = 40 5*9 = 45
6*6 = 36 6*7 = 42 6*8 = 48 6*9 = 54
7*7 = 49 7*8 = 56 7*9 = 63
8*8 = 64 8*9 = 72
9*9 = 81for range
for range可以更加方便的遍歷一些可迭代的數據結構,如數組,切片,字符串,映射表,通道。語句格式如下:
go
for index, value := range iterable {
// body
}index為可迭代數據結構的索引,value則是對應索引下的值,例如使用for range遍歷一個字符串。
go
func main() {
sequence := "hello world"
for index, value := range sequence {
fmt.Println(index, value)
}
}for range也可以迭代一個整型值,字面量,常量,變量都是有效的。
go
for i := range 10 {
fmt.Println(i)
}
n := 10
for i := range n {
fmt.Println(i)
}
const n = 10
for i := range n {
fmt.Println(i)
}對於每一個種數據結構,for range的實現都有所不同,後續也會講到,你可以前往Go - for statement以了解更多細節。
break
break關鍵字會終止最內層的for循環,結合標簽一起使用可以達到終止外層循環的效果,例子如下:這是一個雙循環
go
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break
}
fmt.Println(i, j)
}
}
}輸出
1 0
2 0
2 1
3 0
3 1
3 2
...
9 6
9 7
9 8使用標簽來中斷外層循環
go
func main() {
Outer:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break Outer
}
fmt.Println(i, j)
}
}
}輸出
continue
continue關鍵字會跳過最內層循環的本次迭代,直接進入下一次迭代,結合標簽使用可以達到跳過外層循環的效果,例子如下
go
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue
}
fmt.Println(i, j)
}
}
}輸出
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
...
7 7
7 8
7 9
8 8
8 9
9 9使用標簽
go
func main() {
Out:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue Out
}
fmt.Println(i, j)
}
}
}輸出
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9