为了账号安全,请及时绑定邮箱和手机立即绑定

跨通道范围还是使用选择更好?

跨通道范围还是使用选择更好?

Go
弑天下 2023-06-19 15:13:35
伙计们,我想知道如果我只有一个案例(我的频道)并在给定频道关闭时发出结束信号,是在频道范围内还是使用选择更好?给出示例: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

 }

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


查看完整回答
反对 回复 2023-06-19
?
开满天机

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)

}()


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信