考虑下面的Go代码,它将立即调用worker.DoWork(),然后每分钟调用一次:
triggerChan := make(chan time.Time, 1)
triggerChan <- time.Now() // We don't want to wait a minute for the first call of worker.DoWork() to happen.
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
for {
select {
case triggerChan <- <-ticker.C:
case <-triggerChan:
worker.DoWork()
}
}在第一个select之前向triggerChan写入一个值,以将其定向到case <-triggerChan中,以便立即调用worker.DoWork()。然而,如果ticker.C已经有了一个可用的值(如果我们使用像time.Microsecond这样的东西而不是time.Minute),会发生什么呢?运行时是否会看到triggerChan <- <-ticker.C将阻塞,或者它是否会愉快地软锁,而不知道<-ticker.C的结果正在尝试做什么?它知道这种“从频道进入频道”的-situation吗?
发布于 2021-07-01 23:12:31
select根据triggerChan的状态做出决定,但是它首先计算发送操作的右侧表达式。因此,在进入时,它将等待<-ticker.C返回。然后它将从通道中读取第一个值,然后写入...
https://stackoverflow.com/questions/68212654
复制相似问题