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

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


给出示例:


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 本身可能会产生很多次(很多工人)。


弑天下
浏览 103回答 2
2回答

陪伴而非守候

除非选择的另一个分支,否则使用以下内容:for v := range ch {&nbsp; &nbsp; // do some stuff}该代码比问题中提供的 for/select 更简单、更容易理解。如果出于某种原因需要在循环内进行接收,请使用以下代码:&nbsp;for&nbsp; {&nbsp;&nbsp; &nbsp; &nbsp;// do some stuff&nbsp; &nbsp; &nbsp;v, ok := <-ch&nbsp; &nbsp; &nbsp;if !ok {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; break&nbsp;&nbsp; &nbsp; &nbsp;}&nbsp;&nbsp; &nbsp; &nbsp;// do some other stuff&nbsp;}根据经验,应避免使用单分支选择语句。带有单个分支的选择在功能上与单独的分支相同。

开满天机

如果您只是在不需要返回值的完成通道上等待,那么您可以完全放弃 for 循环,因为通道会阻塞。例如// Verbosego func() {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case <-blah.Context.Done():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Cleanup/Close&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}()// Simplifiedgo func() {&nbsp; &nbsp; <-blah.Context.Done():&nbsp; &nbsp; // Cleanup/Close (No return required either)}()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go