【发布时间】:2016-06-08 01:26:35
【问题描述】:
我有一个选择块正在监听 2 个频道、一个自动收报机和一个计时器:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(5 * time.Second)
for {
select {
case z := <-ticker.C:
fmt.Printf("tick %d\n", z)
case <-time.After(12 * time.Second):
fmt.Println("12 seconds elapsed!")
}
}
}
如果我运行代码,time.After 案例永远不会运行,但代码可以正常工作。
如果我删除代码,time.After 会正确触发:
package main
import (
"fmt"
"time"
)
func main() {
for {
select {
case <-time.After(12 * time.Second):
fmt.Println("12 seconds elapsed!")
}
}
}
如果我使用计时器而不是time.After,它可以正常工作:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(5 * time.Second)
timer := time.NewTimer(12 * time.Second)
for {
select {
case z := <-ticker.C:
fmt.Printf("tick %d\n", z)
case <-timer.C:
fmt.Println("12 seconds elapsed!")
}
}
}
为什么会这样?
【问题讨论】:
-
我不明白这个问题。 12 秒总是比 5 秒长;您能解释一下您对 time.After 会在不到 5 秒内触发的原因吗?
-
我预计它不会在 5 秒内触发。我预计在 5 秒时会有一个滴答声,在 10 秒和 12 秒时会有另一个滴答声,
time.After应该会触发。但是,除非我使用time.NewTimer创建计时器,否则无论我等待多长时间,time.After都不会触发。