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

在 Go 中,我如何以相同的方式对来自多个通道的输入做出反应?

在 Go 中,我如何以相同的方式对来自多个通道的输入做出反应?

Go
宝慕林4294392 2021-12-27 16:08:01
我有一些具有两种不同超时间隔的并发代码,一种是静态的,一种是动态的。我想对他们两个做出同样的反应。这是它的要点:select {case <-time.After(staticTimeoutInterval):    doSomething()case <-time.After(dynamicTimeoutInterval):    doSomething()}有没有办法只写一次 doSomething() ?奇怪的select是,switch在这方面没有那么灵活。
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

在您的特定情况下,您可以使用类似


timeout := min(staticTimeoutInterval, dynamicTimeoutInterval)


select {

case <-time.After(timeout):

    doSomething()

}


func min(a, b time.Duration) int {

    if a < b {

        return a

    }

    return b

}

关于switchand的看似不一致的处理select- 虽然这些语句具有相似的语法,但其目的switch是分支执行,而目的select是通信。

如果我可以夸大:

  • switch是关于部分case表现-在case这里表达主要是一个简单的,无副作用的表达

  • select是关于部分case表达-在case这里表达提供了重要的通信副作用,是不平凡的,在所有实施

select在某些情况下,允许fallthrough in将允许您节省几行,但这通常会使select语句更难以推理。如果在其他情况下也有类似的选择,Go 的创建者几乎总是采用更冗长但更易于理解的方式。


查看完整回答
反对 回复 2021-12-27
?
慕容708150

TA贡献1831条经验 获得超4个赞

你得到的看起来是对的。select案件不会落空。如果确实如此,它将消除清晰度并导致相同数量的代码行。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号