当且仅当我在特定时间段内我的 select 语句正在侦听的任何通道上都没有收到任何信号时,我该如何跳出包含 select 语句的惯用 Go for 循环。
让我用一个例子来加强这个问题。
假设我有一个var listenCh <-chan string
正在收听的频道。
让我们假设其他一些 go 例程(不在我们的控制范围内)在此通道上发送不同的字符串。
我对给定的字符串进行一些处理,然后在listenCh
.
我想在 上的两个连续信号之间最多等待 10 秒(精度不重要)listenCh
,然后再关闭我的操作(永久中断 for 循环)。
func doingSomething(listenCh <-chan string) {
var mystr string
for {
select {
case mystr <-listenCh:
//dosomething
case /*more than 10 seconds since last signal on listenCh*/:
return
}
}
}
我将如何以最有效的方式实现我的要求。
通常的退出通道技术time.After(time.Duration)似乎在一个循环后不会重置,因此即使有连续的值流,整个程序也会在 10 秒内关闭。
我在 SO 上找到了问题的变体(但不是我想要的),但我看到的没有一个能回答我的特定用例。
心有法竹
相关分类