Go 語言中Select與for結合使用時可能會遇到的坑

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

  作為一個剛接觸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:}

如上,成功從坑中走出。



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.