1. 程式人生 > 程式設計 >golang 跳出for迴圈操作

golang 跳出for迴圈操作

執行以下程式碼,發現無法跳出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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。