1
我有一个运行for
循环的多个例程的应用程序,并且需要一种方法来指示这些for
循环中断,并测试是否发生超时情况。我一直在寻找到使用与select
语句共享信道来实现这一点,如下所示:golang select语句中的case与default的优先级
// elsewhere in the code, this channel is created, and passed below
done := make(chan struct{})
time.AfterFunc(timeout, func() { close(done) })
...
go func() {
Loop:
for {
select {
case <-done:
break Loop
default:
foo()
time.Sleep(1 * time.Second)
}
}
select {
case <-done:
panic("timed out!")
default:
// ok
}
}()
这是做到这一点的有效方法?我最关心的是选择的select
的分支可能是非确定性的,因此即使case
中的一个准备就绪,也可以选择default
。这可能吗?是否有任何文件表明匹配的case
保证优先于default
。值得关注的是,在done
关闭和/或报告成功后,即使发生超时,上面的for循环可能会循环多次。
这也包括在内(不详细)[在围棋游览](https://tour.golang.org/concurrency/6)。 – Adrian