伙计们,我想知道如果我只有一个案例(我的频道)并在给定频道关闭时发出结束信号,是在频道范围内还是使用选择更好?给出示例: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条经验 获得超12个赞
如果您只是在不需要返回值的完成通道上等待,那么您可以完全放弃 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 关注
- 102 浏览
添加回答
举报
0/150
提交
取消