选择"代码"时,时间。之后不起作用



我在尝试time.Ticker时遇到了这个问题。

如下所示,case <-time.After(time.Millisecond * 5500):从未执行,程序打印"ticker"one_answers";chan"反复.

有人能解释一下吗?

package main
import (
"fmt"
"os"
"time"
)
func main() {
ticker := time.NewTicker(time.Second * 2)
defer ticker.Stop()
ch := time.Tick(time.Second * 3)
for {
select {
case t := <-ticker.C:
fmt.Println("From ticker:", t)
case t := <-ch:
fmt.Println("From chan:", t)
case <-time.After(time.Millisecond * 5500):
fmt.Println("timeout, exit")
os.Exit(1)
}
}
}

输出:

From ticker: 2021-02-02 11:31:55.9902354 +0800 CST m=+2.002391201
From chan: 2021-02-02 11:31:56.990678 +0800 CST m=+3.002835701
From ticker: 2021-02-02 11:31:57.9900811 +0800 CST m=+4.002240701
From chan: 2021-02-02 11:31:59.9901219 +0800 CST m=+6.002285301
From ticker: 2021-02-02 11:31:59.9901219 +0800 CST m=+6.002285301
From ticker: 2021-02-02 11:32:01.9901347 +0800 CST m=+8.002301901
From chan: 2021-02-02 11:32:02.990973 +0800 CST m=+9.003142101
From ticker: 2021-02-02 11:32:03.9899932 +0800 CST m=+10.002164201
From ticker: 2021-02-02 11:32:05.9911548 +0800 CST m=+12.003329601
From chan: 2021-02-02 11:32:05.9911548 +0800 CST m=+12.003329601
From ticker: 2021-02-02 11:32:07.9898197 +0800 CST m=+14.001998301

一切正常。你的前两种情况总是在小于5500ms的时间内产生一个值,所以不,time.After永远不会产生一个值。

每次遇到select时,time.After返回一个通道,该通道将在5.5秒内发出一个值。实际上,您永远不会等待5.5秒,因为两个计时器总是先发出值,因此selecttime.After分支永远不会执行,并且该通道被丢弃。