覆盖频道还是使用选择更好?

var*_*ius 7 go

伙计们,我想知道如果我只有一个案例(我的频道)并在给定频道关闭时发出结束信号,是否更好地覆盖频道或使用选择?

鉴于以下示例:

1. https://play.golang.org/p/3ZFdbgHSKyN

go func() {
    for v := range ch {
        // do some stuff
    }
}()
Run Code Online (Sandbox Code Playgroud)

2. https://play.golang.org/p/iCCkDge8j72

go func() {
    for {
        select {
        case v, ok := <-ch:
            if !ok {
                return
            }

            // do some stuff
        }
    }
}()
Run Code Online (Sandbox Code Playgroud)

哪种解决方案是首选,为什么?请考虑这样一个事实,即 goroutines 可能会产生很多次(许多工人)。

Cer*_*món 6

除非有另一个选择分支,否则使用以下内容:

for v := range ch {
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

该代码比问题中提供的 for/select 更简单、更容易理解。

如果由于某种原因需要在循环内部进行接收,则使用以下代码:

 for  { 
     // do some stuff
     v, ok := <-ch
     if !ok { 
        break 
     } 
     // do some other stuff
 }
Run Code Online (Sandbox Code Playgroud)

根据经验,应避免使用单分支选择语句。带有单个分支的选择在功能上与单独的分支相同。