參考官方 Effective Go 文件。
Go 唯一的迴圈就是 for ,沒有別的。要達成各種功能,可以靠 for 的語法變化來達成。
for 的基本型式
for init; condition; post { }
- init: 迴圈開始前的初始化
- condition: 迴圈停止的條件
- post: 每圈結束後要做的事
若要使用這種型式,這三個參數可寫可不寫,但位置要留著,也就是 ";” 不能省。
for 的第二種型式(類似while):
for condition { }
for 的第三種型式(無窮迴圈):
for { }
// 效果等同第一種型式的以下寫法:
// for ;; { }
for 的第四種型式(iterate over):
for key, value := range iterable { }
for _, value := range iterable { }
for key := range iterable { }
- iterable: array, slice, string, or map。
- 若 iterable 是 array, slice, string 則 key 是index; 否則 key 就是 map 的key。
當 iterable 是 string 時,若遇到無法以utf-8 解析的字元,會自動以rune U+FFFD ‘�’ 帶入 value。
for 也可以用在讀 channel ,以後進入channel再補充。
for scope
在 for 裡面宣告的變數 (包含在 init 宣告的變數),其生命週期只在 for 的scope之內。
Label, continue, break, goto
在多層loop的情況下,搭配label可以在多層迴圈中移動,動作有continue、break、goto。下例為使用break跳出2層迴圈:
package main
import "fmt"
func main() {
L1:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
fmt.Println("i=", i, "\tj=", j)
if j > 3 {
break L1
}
}
}
}
結果
i= 0 j= 0
i= 0 j= 1
i= 0 j= 2
i= 0 j= 3
i= 0 j= 4