在选择 Ticker 时,time.After 不起作用

Gav*_* Xu -2 go

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

如下面的代码,case <-time.After(time.Millisecond * 5500):从不执行,程序重复打印“ticker”和“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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 5

一切都按预期进行。您的前两种情况总是在不到 5500 毫秒的时间内产生一个值,所以不会,time.After永远不会产生一个值。

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

  • 我想我会分享代码来修复它:https://play.golang.org/p/yE9F5vGmhvF (2认同)