代码创建一个容量为 1的缓冲通道。当通道已满时,自动收报机会丢弃时间值。

这是问题中跟踪的时间表。同一时间列出的事件按列出的顺序依次发生一点点。

1s - ticker sends value

1s - main goroutine receives first value

1s - main goroutine starts sleep for 5s

2s - ticker sends value (channel has capacity 1).

3s - ticker fails to send value because channel is full

4s - ticker fails to send value because channel is full

5s - ticker fails to send value because channel is full

6s - main goroutine exits sleep and receives buffered value

6s - ticker sends value

6s - main goroutine receives buffered value

ticker 和 main goroutine 跑到 6s 标记,因为 sleep 是 ticker 周期的倍数。在您的跟踪中,主 goroutine 赢得了比赛。在我的机器上,自动收报机赢得了比赛,我得到了你期望的时间。这是我机器上的样子。


...

5s - ticker fails to send value because channel is full

6s - ticker fails to send value because channel is full

6s - main goroutine receives buffered value

7s - ticker sends value

7s - main goroutine receives value

自动收报机在操场上以 6 秒的成绩赢得比赛。 在这里运行它。当睡眠时间减少 1µs 时,主 goroutine 赢得了比赛。在这里运行它。


当睡眠持续时间不是代码周期的倍数时,这很容易看出。以下是睡眠持续时间为 2.5 秒时发生的情况:


1s - ticker sends value

1s - main goroutine receives first value

1s - main goroutine starts sleep for 2.5s

2s - ticker sends value

3s - ticker fails to send value because channel is full

3.5s - main goroutine exits sleep and receives buffered value

4s - ticker sends value

4s - main goroutine receives value