伙計們,我想知道如果我只有一個案例(我的頻道)并在給定頻道關閉時發出結束信號,是在頻道范圍內還是使用選擇更好?給出示例: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
}
根據經驗,應避免使用單分支選擇語句。帶有單個分支的選擇在功能上與單獨的分支相同。

開滿天機
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)
}()
- 2 回答
- 0 關注
- 141 瀏覽
添加回答
舉報
0/150
提交
取消