亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

跨通道范圍還是使用選擇更好?

跨通道范圍還是使用選擇更好?

Go
弒天下 2023-06-19 15:13:35
伙計們,我想知道如果我只有一個案例(我的頻道)并在給定頻道關閉時發出結束信號,是在頻道范圍內還是使用選擇更好?給出示例:1. https://play.golang.org/p/3ZFdbgHSKyNgo func() {    for v := range ch {        // do some stuff    }}()2. https://play.golang.org/p/iCCkDge8j72go func() {    for {        select {        case v, ok := <-ch:            if !ok {                return            }            // do some stuff        }    }}()首選哪種解決方案,為什么?請考慮這樣一個事實,即 goroutines 本身可能會產生很多次(很多工人)。
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

除非選擇的另一個分支,否則使用以下內容:


for v := range ch {

    // do some stuff

}

該代碼比問題中提供的 for/select 更簡單、更容易理解。


如果出于某種原因需要在循環內進行接收,請使用以下代碼:


 for  { 

     // do some stuff

     v, ok := <-ch

     if !ok { 

        break 

     } 

     // do some other stuff

 }

根據經驗,應避免使用單分支選擇語句。帶有單個分支的選擇在功能上與單獨的分支相同。


查看完整回答
反對 回復 2023-06-19
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

如果您只是在不需要返回值的完成通道上等待,那么您可以完全放棄 for 循環,因為通道會阻塞。例如


// Verbose

go func() {

    for {

        select {

            case <-blah.Context.Done():

                // Cleanup/Close

                return

        }

    }

}()


// Simplified

go func() {

    <-blah.Context.Done():

    // Cleanup/Close (No return required either)

}()


查看完整回答
反對 回復 2023-06-19
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號