golang 跳出for循環(huán)操作
執(zhí)行以下代碼,發(fā)現(xiàn)無法跳出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語言中,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無法跳出循環(huán):
... close channel 1 false close channel 1 false close channel 1 false close channel 1 false ...
了解決這個(gè)問題,需要設(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ò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
go的websocket實(shí)現(xiàn)原理與用法詳解
這篇文章主要介紹了go的websocket實(shí)現(xiàn)原理與用法,詳細(xì)分析了websocket的功能、原理及Go語言實(shí)現(xiàn)websocket的相關(guān)技巧,需要的朋友可以參考下2016-07-07Go語言實(shí)現(xiàn)簡單Web服務(wù)器的方法
這篇文章主要介紹了Go語言實(shí)現(xiàn)簡單Web服務(wù)器的方法,實(shí)例分析了Web服務(wù)器的實(shí)現(xiàn)原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02golang字符串轉(zhuǎn)64位整數(shù)的示例代碼
這篇文章主要介紹了golang字符串轉(zhuǎn)64位整數(shù),在Go語言中,可以使用strconv包中的ParseInt函數(shù)將字符串轉(zhuǎn)換為64位整數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09golang中slice擴(kuò)容的具體實(shí)現(xiàn)
Go 語言中的切片擴(kuò)容機(jī)制是 Go 運(yùn)行時(shí)的一個(gè)關(guān)鍵部分,它確保切片在動(dòng)態(tài)增加元素時(shí)能夠高效地管理內(nèi)存,本文主要介紹了golang中slice擴(kuò)容的具體實(shí)現(xiàn),感興趣的可以了解一下2025-05-05