伙计们,我想知道如果我只有一个案例(我的频道)并在给定频道关闭时发出结束信号,是否更好地覆盖频道或使用选择?
鉴于以下示例:
go func() {
for v := range ch {
// do some stuff
}
}()
Run Code Online (Sandbox Code Playgroud)
go func() {
for {
select {
case v, ok := <-ch:
if !ok {
return
}
// do some stuff
}
}
}()
Run Code Online (Sandbox Code Playgroud)
哪种解决方案是首选,为什么?请考虑这样一个事实,即 goroutines 可能会产生很多次(许多工人)。
除非有另一个选择分支,否则使用以下内容:
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)
根据经验,应避免使用单分支选择语句。带有单个分支的选择在功能上与单独的分支相同。