Reputation: 13
I naively wrote a piece of code to change the interval of a time.Ticker
, and upon reviewing it I am irritated that it works:
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
ticker 02:19:03
ticker 02:19:08
ticker 02:19:13
switching
ticker 02:19:15
ticker 02:19:16
ticker 02:19:17
It does what I want, namely switch the frequency of the ticker
Ticker to one second after 16 seconds. However, reading it again I would expect that after 16 seconds, a new Ticker object is created, while the select
statement holds a reference to the channel of the old one, preventing it from garbage collection and keep on ticking every five seconds.
So why does this code change the ticker's frequency?
Upvotes: 1
Views: 213
Reputation: 109438
A select
statement isn't a closure and doesn't "hold" a reference to anything.
You're simply replacing the value of ticker
, and as you can see, the interval changes accordingly.
Upvotes: 5