我正在尝试在Go中编写一个包含可选超时的select,如下所示:
done := false
for !done {
if timeout > 0 {
select {
case value := <- somechannel:
// Do something with value
case <- time.After(timeout):
done = true
}
} else {
select {
case value := <- somechannel:
// Do something with value
default:
done = true
}
}
}
也就是说,如果频道上没有待处理的内容,并且我没有设置超时,我退出。如果设置了超时并且没有任何可用,那么我会等待超时或通道上的某些内容。我喜欢将它组合成一个选择,但我看不出我能做到这一点。有什么想法吗?
答案 0 :(得分:1)
以下是我将如何实现您想要的内容:
func foo() {
if timeout > 0 {
timer := time.NewTimer(timeout)
defer timer.Stop()
wait:
for {
select {
case value := <-somechannel:
// Do something with value
case <-timer.C:
break wait
}
}
} else {
drain:
for {
select {
case value := <-somechannel:
// Do something with value
default:
break drain
}
}
}
}
第一个循环是正常消耗,直到超时。第二个循环消失,直到没有立即可用。