2 回答

TA贡献1893条经验 获得超10个赞
Aselect阻塞,直到它的一个案例准备好,然后它执行那个案例。在您的示例中 time.After() 永远不会被调用。
func main() {
ticker := time.NewTicker(5 * time.Second)
for {
select {
case z := <-ticker.C:
fmt.Printf("tick %d\n", z)
//This never gets chance to be ready. It'll work if you make it less than 5 seconds.
case <-time.After(12 * time.Second):
fmt.Println("12 seconds elapsed!")
}
}
}
您可以通过在for循环之前声明计时器来使其工作。
func main() {
ticker := time.NewTicker(5 * time.Second)
timer := time.After(12 * time.Second)
for {
select {
case z := <-ticker.C:
fmt.Printf("tick %d\n", z)
case <-timer:
fmt.Println("12 seconds elapsed!")
}
}
}

TA贡献1789条经验 获得超8个赞
关键是,当调用 select 时,它将在所有 case 子句中重新创建通道。如果您在 中创建计时器case <- newCreateTimerChannel
,它将启动一个新计时器。所以把定时器的创建放在for循环之外,让它成为一个全局定时器。
- 2 回答
- 0 关注
- 181 浏览
添加回答
举报