我天真地写了一段代码来改变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
语句保存对旧的通道的引用,防止它被垃圾收集并继续每五个滴答一次。秒。
那么为什么这段代码改变了自动收报机的频率?
答案 0 :(得分:5)
select
语句不是闭包,并且不“保留”对任何内容的引用。
您只需替换ticker
的值,如您所见,间隔会相应更改。