執(zhí)行以下代碼,發(fā)現(xiàn)無(wú)法跳出for循環(huán):
func SelectTest() {
i := 0
for {
select {
case -time.After(time.Second * time.Duration(2)):
i++
if i == 5 {
fmt.Println("跳出for循環(huán)")
}
}
fmt.Println("for循環(huán)內(nèi) i=", i)
}
fmt.Println("for循環(huán)外")
}
解決辦法有兩個(gè):
1.使用break:
func SelectTest() {
i := 0
Loop:
for {
select {
case -time.After(time.Second * time.Duration(2)):
i++
if i == 5 {
fmt.Println("跳出for循環(huán)")
break Loop
}
}
fmt.Println("for循環(huán)內(nèi) i=", i)
}
fmt.Println("for循環(huán)外")
}
2.使用goto:
func SelectTest() {
i := 0
for {
select {
case -time.After(time.Second * time.Duration(2)):
i++
if i == 5 {
fmt.Println("跳出for循環(huán)")
goto Loop
}
}
fmt.Println("for循環(huán)內(nèi) i=", i)
}
Loop:
fmt.Println("for循環(huán)外")
}
分析:
使用break lable 和 goto lable 都能跳出for循環(huán);不同之處在于:break標(biāo)簽只能用于for循環(huán),且標(biāo)簽位于for循環(huán)前面,goto是指跳轉(zhuǎn)到指定標(biāo)簽處
補(bǔ)充:golang跳出for select 循環(huán)
通常在for循環(huán)中,使用break可以跳出循環(huán),但是注意在go語(yǔ)言中,for select配合時(shí),break并不能跳出循環(huán)。
func testSelectFor(chExit chan bool){
for {
select {
case v, ok := -chExit:
if !ok {
fmt.Println("close channel 1", v)
break
}
fmt.Println("ch1 val =", v)
}
}
fmt.Println("exit testSelectFor")
}
如下調(diào)用:
//嘗試2 select for 跳出循環(huán)
c := make(chan bool)
go testSelectFor(c)
c - true
c - false
close(c)
time.Sleep(time.Duration(2) * time.Second)
運(yùn)行結(jié)果如下,可以看到break無(wú)法跳出循環(huán):
...
close channel 1 false
close channel 1 false
close channel 1 false
close channel 1 false
...
了解決這個(gè)問(wèn)題,需要設(shè)置標(biāo)簽,break 標(biāo)簽或goto 便簽即可跳出循環(huán),如下兩種方法均可。
func testSelectFor2(chExit chan bool){
EXIT:
for {
select {
case v, ok := -chExit:
if !ok {
fmt.Println("close channel 2", v)
break EXIT//goto EXIT2
}
fmt.Println("ch2 val =", v)
}
}
//EXIT2:
fmt.Println("exit testSelectFor2")
}
同樣調(diào)用,輸出結(jié)果如下:
ch2 val = true
ch2 val = false
close channel 2 false
exit testSelectFor2
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- golang中for循環(huán)遍歷channel時(shí)需要注意的問(wèn)題詳解
- Golang常見(jiàn)錯(cuò)誤之值拷貝和for循環(huán)中的單一變量詳解
- Golang實(shí)現(xiàn)for循環(huán)運(yùn)行超時(shí)后自動(dòng)退出的方法
- golang語(yǔ)言中for循環(huán)語(yǔ)句用法實(shí)例