我有一些具有两种不同超时间隔的并发代码,一种是静态的,一种是动态的。我想对他们两个做出同样的反应。这是它的要点: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
}
关于switch
and的看似不一致的处理select
- 虽然这些语句具有相似的语法,但其目的switch
是分支执行,而目的select
是通信。
如果我可以夸大:
switch
是关于部分后的case
表现-在case
这里表达主要是一个简单的,无副作用的表达select
是关于部分中的case
表达-在case
这里表达提供了重要的通信副作用,是不平凡的,在所有实施
select
在某些情况下,允许fallthrough in将允许您节省几行,但这通常会使select
语句更难以推理。如果在其他情况下也有类似的选择,Go 的创建者几乎总是采用更冗长但更易于理解的方式。
- 2 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消