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

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

選擇阻塞的呼叫和頻道

選擇阻塞的呼叫和頻道

Go
素胚勾勒不出你 2022-06-27 16:12:15
我很確定我以前看過一個關于此的問題,但現在找不到。本質上,我想select在一個被阻止的呼叫以及一個頻道上。我知道我可以將阻塞的調用推送到 goroutine 中并通過通道等待結果,但這感覺像是錯誤的解決方案。有沒有一種慣用的方式來寫我缺少的這個?最理想的情況是:select {case a <- c:  ...case ans := connection.Read():  ...}
查看完整描述

1 回答

?
慕田峪9158850

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

如果你有一個你想要的通道和函數select,使用 goroutine 和通道是慣用的解決方案。請注意,如果從通道接收到值,則不會影響函數,它將繼續運行。您可以使用context.Context它來表示不再需要它的結果,并且它可能會提前終止。


如果您被允許重構,您可以“使”函數在同一通道上發送,因此您只需要從單個通道接收。


另一個重構想法是讓函數監視相同的通道并提前返回,所以你可以只做一個沒有select.


請注意,如果您需要在許多地方執行此操作,您可以創建一個輔助函數來異步啟動它:


func launch(f func()) <-chan struct{} {

    done := make(chan struct{})

    go func() {

        defer close(done)

        f()

    }()

    return done

}

示例函數:


func test() {

    time.Sleep(time.Second)

}

然后使用它:


select {

case a := <-c:

    fmt.Println("received from channel:", a)

case <-launch(test):

    fmt.Println("test() finished")


}


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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