golang 跳出多重循環(huán)的高級break用法說明
平時寫代碼過程中難免會遇到循環(huán)嵌套的操作,這時候最頭疼的就是在break的時候需要一層一層的退出或者使用goto語句,golang有一種和goto方式類似但是goto方式更友好并且更易讀的高級break用法,就是在循環(huán)外使用label標記退出哪一層循環(huán)的方式。
示例代碼:
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外層循環(huán)
問題
默認在select中break是只跳脫了select體,而不是結束for循環(huán)
for { select{ case <-tick.C: //do someting case <- stop: break //break的不是for循環(huán), 而是跳脫select,執(zhí)行doNext() } doNext() }
如何在for的select體中break到外層循環(huán)呢?
1.解決辦法
1.1 使用帶標簽的break
LOOP: for { select{ case <-tick.C: //do someting case <- stop: break LOOP//break的for循環(huán),跳轉(zhuǎn)執(zhí)行doOther() } doNext() } doOther()
等價于C的goto,但是又不同。比如這里for循環(huán)前的標簽,對于如果使用goto LOOP會導致再次執(zhí)行循環(huán)。但是golang的break到這里是跳出循環(huán),執(zhí)行循環(huán)之后的操作
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()
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
關于go-zero單體服務使用泛型簡化注冊Handler路由的問題
這篇文章主要介紹了go-zero單體服務使用泛型簡化注冊Handler路由,涉及到Golang環(huán)境安裝及配置Go Module的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07詳解golang中?work與?module?的區(qū)別與聯(lián)系
Go?模塊通常由一個項目或庫組成,并包含一組隨后一起發(fā)布的?Go?包,Go?模塊通過允許用戶將項目代碼放在他們選擇的目錄中并為每個模塊指定依賴項的版本,解決了原始系統(tǒng)的許多問題,本文將給大家介紹一下golang中?work與?module?的區(qū)別與聯(lián)系,需要的朋友可以參考下2023-09-09Go 并發(fā)控制context實現(xiàn)原理剖析(小結)
Golang context是Golang應用開發(fā)常用的并發(fā)控制技術,這篇文章主要介紹了Go 并發(fā)控制context實現(xiàn)原理剖析(小結),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10Go 1.21新增的slices包中切片函數(shù)用法詳解
Go 1.21新增的 slices 包提供了很多和切片相關的函數(shù),可以用于任何類型的切片,本文通過代碼示例為大家介紹了部分切片函數(shù)的具體用法,感興趣的小伙伴可以了解一下2023-08-08Go語言普通指針unsafe.Pointer?uintpt之間的關系及指針運算
這篇文章主要為大家介紹了Go語言普通指針unsafe.Pointer?uintpt之間的關系及指針運算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12