跨频道范围还是使用select更好?

时间:2019-05-15 05:38:18

标签: go

伙计们,我想知道如果只使用一种情况(我的频道)并用给定频道的结尾表示结束,是在频道范围内使用还是使用select更好?

给出示例:

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

go func() {
    for v := range ch {
        // do some stuff
    }
}()

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

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

            // do some stuff
        }
    }
}()

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

1 个答案:

答案 0 :(得分:0)

除非选择的另一个分支,否则使用以下命令:

for v := range ch {
    // do some stuff
}

该代码比问题中显示的for / select更简单易懂。

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

 for  { 
     // do some stuff
     v, ok := <-ch
     if !ok { 
        break 
     } 
     // do some other stuff
 }

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