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