Ticker间隔更改时出现意外行为

时间:2014-05-01 00:28:24

标签: go

我天真地写了一段代码来改变time.Ticker的间隔,在审查它时我很生气它有效:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(5 * time.Second)
    switcher := time.NewTimer(16 * time.Second)
    for {
        select {
        case <-ticker.C:
            fmt.Println("ticker " + time.Now().Format("15:04:05"))
        case <-switcher.C:
            fmt.Println("switching")
            ticker = time.NewTicker(1 * time.Second)
        }
    }
}
  

$ go run main.go
  自动收报机02:19:03
  自动收报机02:19:08
  自动收报机02:19:13
  切换
  自动收报机02:19:15
  自动收报机02:19:16
  自动收报机02:19:17

它做我想要的,即在16秒后将ticker Ticker的频率切换为一秒。但是,再读一遍,我希望在16秒后创建一个新的Ticker对象,而select语句保存对旧的通道的引用,防止它被垃圾收集并继续每五个滴答一次。秒。

那么为什么这段代码改变了自动收报机的频率?

1 个答案:

答案 0 :(得分:5)

select语句不是闭包,并且不“保留”对任何内容的引用。 您只需替换ticker的值,如您所见,间隔会相应更改。