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

我有一些具有两种不同超时间隔的并发代码,一种是静态的,一种是动态的。我想对他们两个做出同样的反应。这是它的要点:


select {

case <-time.After(staticTimeoutInterval):

    doSomething()

case <-time.After(dynamicTimeoutInterval):

    doSomething()

}

有没有办法只写一次 doSomething() ?奇怪的select是,switch在这方面没有那么灵活。


宝慕林4294392
浏览 177回答 2
2回答

慕尼黑的夜晚无繁华

在您的特定情况下,您可以使用类似timeout := min(staticTimeoutInterval, dynamicTimeoutInterval)select {case <-time.After(timeout):&nbsp; &nbsp; doSomething()}func min(a, b time.Duration) int {&nbsp; &nbsp; if a < b {&nbsp; &nbsp; &nbsp; &nbsp; return a&nbsp; &nbsp; }&nbsp; &nbsp; return b}关于switchand的看似不一致的处理select- 虽然这些语句具有相似的语法,但其目的switch是分支执行,而目的select是通信。如果我可以夸大:switch是关于部分后的case表现-在case这里表达主要是一个简单的,无副作用的表达select是关于部分中的case表达-在case这里表达提供了重要的通信副作用,是不平凡的,在所有实施select在某些情况下,允许fallthrough in将允许您节省几行,但这通常会使select语句更难以推理。如果在其他情况下也有类似的选择,Go 的创建者几乎总是采用更冗长但更易于理解的方式。

慕容708150

你得到的看起来是对的。select案件不会落空。如果确实如此,它将消除清晰度并导致相同数量的代码行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go