Go之旅-for循環(huán)
Go語(yǔ)言?xún)H有for一種循環(huán)語(yǔ)句,但常用方式都能支持。其中初始化表達(dá)式支持函數(shù)調(diào)用或定義局部變量,需要注意的是初始化語(yǔ)句中的函數(shù)僅執(zhí)行一次,條件表達(dá)式中的函數(shù)重復(fù)執(zhí)行,規(guī)避方式就是在初始化表達(dá)式中定義局部變量保存函數(shù)返回結(jié)果。Go語(yǔ)言中也有g(shù)oto語(yǔ)句,使用goto語(yǔ)句前,必須先定義標(biāo)簽,標(biāo)簽區(qū)分大小寫(xiě),并且未使用的標(biāo)簽會(huì)引發(fā)編譯錯(cuò)誤。和goto定點(diǎn)跳轉(zhuǎn)不同,break、continue用于中斷代碼塊執(zhí)行。break用于switch、for、select語(yǔ)句,終止整個(gè)語(yǔ)句塊執(zhí)行,continue僅用于for循環(huán),終止后續(xù)邏輯,立即進(jìn)入下一輪循環(huán)。break和continue配合標(biāo)簽使用,可以在多層嵌套中指定目標(biāo)層級(jí)。
package main
import (
"fmt"
)
// count函數(shù)
func count() int {
fmt.Println("count.") // 打印字符串用來(lái)查看count函數(shù)執(zhí)行次數(shù)
return 3
}
// main函數(shù)
func main() {
// for循環(huán)
// 初始化表達(dá)式,支持函數(shù)調(diào)用或定義局部變量
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 類(lèi)似while循環(huán)
i := 0
for i < 10 {
fmt.Println(i)
i++
}
// 類(lèi)似無(wú)限循環(huán)
for {
break
}
// 初始化語(yǔ)句中的count函數(shù)僅執(zhí)行一次
for i, c := 0, count(); i < c; i++ {
fmt.Println("a", i)
}
c := 0
// 條件表達(dá)式中的count函數(shù)重復(fù)執(zhí)行
for c < count() {
fmt.Println("b", c)
c++
}
// 規(guī)避條件表達(dá)式中的count函數(shù)重復(fù)執(zhí)行,在初始化表達(dá)式中定義局部變量保存count函數(shù)返回結(jié)果
count := count()
d := 0
for d < count {
fmt.Println("c", d)
d++
}
// goto定點(diǎn)跳轉(zhuǎn)
// 須先定義標(biāo)簽,并且未用到的標(biāo)簽會(huì)引發(fā)編譯錯(cuò)誤
// 不能跳轉(zhuǎn)到其它函數(shù),或內(nèi)層代碼塊內(nèi)
for i := 0; i < 10; i++ {
fmt.Println(i)
if i > 5 {
goto exit
}
}
exit:
fmt.Println("exit.")
// break 用戶(hù)switch、for、select語(yǔ)句,終止整個(gè)語(yǔ)句塊執(zhí)行。continue 僅用于for循環(huán),終止后續(xù)邏輯,立即進(jìn)入下一輪循環(huán)
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue // 立即進(jìn)入下一輪循環(huán)
}
if i > 5 {
break // 立即終止整個(gè)for循環(huán)
}
fmt.Println(i)
}
// 配合標(biāo)簽,break和continue可在多層嵌套中指定目標(biāo)層級(jí)
outer:
for i := 0; i < 5; i++ {
for j := 0; j < 10; j++ {
if j > 2 {
fmt.Println()
continue outer
}
if i > 2 {
break outer
}
fmt.Print(i, ":", j, " ")
}
}
}