1. 程式人生 > 程式設計 >golang 跳出多重迴圈的高階break用法說明

golang 跳出多重迴圈的高階break用法說明

平時寫程式碼過程中難免會遇到迴圈巢狀的操作,這時候最頭疼的就是在break的時候需要一層一層的退出或者使用goto語句,golang有一種和goto方式類似但是goto方式更友好並且更易讀的高階break用法,就是在迴圈外使用label標記退出哪一層迴圈的方式。

示例程式碼:

I:
 for i := 0; i < 2; i++ {
 for j := 0; j < 5; j++ {
 if j == 2 {
 break I
 }
 fmt.Println("hello")
 }
 fmt.Println("hi")
 }

程式的執行結果:

hello

hello

補充:golang for的select體中如何break外層迴圈

問題

預設在select中break是隻跳脫了select體,而不是結束for迴圈

for {
 select{
 case <-tick.C:
  //do someting
 case <- stop:
  break //break的不是for迴圈,而是跳脫select,執行doNext()
 }
 doNext()
}

如何在for的select體中break到外層迴圈呢?

1.解決辦法

1.1 使用帶標籤的break

LOOP: for {
 select{
 case <-tick.C:
  //do someting
 case <- stop:
  break LOOP//break的for迴圈,跳轉執行doOther()
 }
 doNext()
}
doOther()

等價於C的goto,但是又不同。比如這裡for迴圈前的標籤,對於如果使用goto LOOP會導致再次執行迴圈。但是golang的break到這裡是跳出迴圈,執行迴圈之後的操作

1.2 使用return

for {
 select{
 case <-tick.C:
  //do someting
 case <- stop:
  return //乾淨利落,適合退出goroutin的場景
 }
 doNext()
}
doOther()

1.3 使用標誌

isStop := false
for {
 select{
 case <-tick.C:
  //do someting
 case <- stop:
  isStop = true//乾淨利落,適合退出goroutin的場景
  break
 }
 if isStop {
 break
 }
 doNext()
}
doOther()

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