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