這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
作為一個剛接觸go編程的新鳥,是不是被它的某些新特性給嚇到,尤其是之前已經習慣了C++的編程。對於Go語言,網上褒貶不一,有極力推崇的,如七牛的許式偉,其對go的評價極高,並預言Go的市場佔有率會一直逐步上升,取代java,成為第一。也有極力貶低的,他們一般會網路上有各種部落格文章,詳細的剖析了go的不妥之處。而我接觸go這段時間之後,不得不說,它真的是一門很有意思的語言,為什麼用有意思形容呢,借用一句裝逼的話,存在即合理。go能夠慢慢被國內國外的各大互連網公司用於伺服器架構,它自有它的閃光之處,而至於有意思呢,就需要對它有興趣的人慢慢去發現,(呃。。。。這個情景匯入有點長,貌似有點跑偏)
好,言歸正傳,最近在用go開發項目的過程中突然發現一個坑,尤其是對於其它傳統語言轉來的人來說一不住注意就掉坑裡了,話不多說,show you the code。
func test(){ i := 0 for { select { case <-time.After(time.Second * time.Duration(2)): i++ if i == 5{ fmt.Println("break now") break } fmt.Println("inside the select: ") } fmt.Println("inside the for: ") }}執行後發現,什嗎?居然break不出去?後來查了一下資料發現,當for 和 select結合使用時,break語言是無法跳出for之外的,因此若要break出來,這裡需要加一個標籤,使用goto, 或者break 到具體的位置
解決方案一:使用golang中break的特性,在外層for加一個標籤
func test(){i := 0ForEnd:for {select {case <-time.After(time.Second * time.Duration(2)):i++if i == 5{fmt.Println("break now")break ForEnd}fmt.Println("inside the select: ")}fmt.Println("inside the for: ")}}
解決方案二: 使用goto直接跳出迴圈
func test(){i := 0for {select {case <-time.After(time.Second * time.Duration(2)):i++if i == 5{fmt.Println("break now")goto ForEnd}fmt.Println("inside the select: ")}fmt.Println("inside the for: ")}ForEnd:}
如上,成功從坑中走出。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。