golang 跳出多重迴圈的高階break用法說明
阿新 • • 發佈:2020-12-16
平時寫程式碼過程中難免會遇到迴圈巢狀的操作,這時候最頭疼的就是在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()
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。