我很確定我以前看過一個關于此的問題,但現在找不到。本質上,我想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")
}
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消