golang 跳出for迴圈操作
阿新 • • 發佈:2020-12-15
執行以下程式碼,發現無法跳出for迴圈:
func SelectTest() { i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5 { fmt.Println("跳出for迴圈") } } fmt.Println("for迴圈內 i=",i) } fmt.Println("for迴圈外") }
解決辦法有兩個:
1.使用break:
func SelectTest() { i := 0 Loop: for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5 { fmt.Println("跳出for迴圈") break Loop } } fmt.Println("for迴圈內 i=",i) } fmt.Println("for迴圈外") }
2.使用goto:
func SelectTest() { i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5 { fmt.Println("跳出for迴圈") goto Loop } } fmt.Println("for迴圈內 i=",i) } Loop: fmt.Println("for迴圈外") }
分析:
使用break lable 和 goto lable 都能跳出for迴圈;不同之處在於:break標籤只能用於for迴圈,且標籤位於for迴圈前面,goto是指跳轉到指定標籤處
補充:golang跳出for select 迴圈
通常在for迴圈中,使用break可以跳出迴圈,但是注意在go語言中,for select配合時,break並不能跳出迴圈。
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") }
如下呼叫:
//嘗試2 select for 跳出迴圈 c := make(chan bool) go testSelectFor(c) c <- true c <- false close(c) time.Sleep(time.Duration(2) * time.Second)
執行結果如下,可以看到break無法跳出迴圈:
... close channel 1 false close channel 1 false close channel 1 false close channel 1 false ...
瞭解決這個問題,需要設定標籤,break 標籤或goto 便籤即可跳出迴圈,如下兩種方法均可。
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") }
同樣呼叫,輸出結果如下:
ch2 val = true ch2 val = false close channel 2 false exit testSelectFor2
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。