登录
首页 >  Golang >  Go问答

为何在golang中的select语句这样设计

来源:stackoverflow

时间:2024-03-11 21:03:19 415浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《为何在golang中的select语句这样设计》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

for {
    select {
    case <-n.ctx.done():
    return
    case ts := <-tsets:
    n.reload(ts)
    default:
        select {
    case <-n.ctx.done():
        return
    case ts := <-tsets:
        n.reload(ts)
    case <-n.more:
        }
    }
}

上面的代码位于 https://github.com/prometheus/prometheus/blob/main/notifier/notifier.go function run(tsets <-chan map[string][]*targetgroup.group) 中。为什么默认又写select呢,难道和下面的代码有什么区别

for {
    select {
    case <-n.ctx.Done():
    return
    case ts := <-tsets:
    n.reload(ts)
    case <-n.more:
    }
}

我想知道这两种实现方式的区别以及影响。谢谢你


正确答案


这是通道优先级的典型实现。如果 <-tsets<-n.more 都可用,则第一个被剪切的代码优先考虑 <-tsets。事实上,只要<-tsets能够执行它就会循环,然后它就会开始查看<-n.more。请注意,选择 default 情况的唯一方法是 <-tsets 无法运行且上下文未取消。当发生这种情况时,它会查看 <-n.more

好了,本文到此结束,带大家了解了《为何在golang中的select语句这样设计》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>