Unfortunately, it seems that Go developers will not add such functionality in any foreseeable future, so we have to cope…
There are two common ways to use tickers:
for
loop
Given something like this:
ticker := time.NewTicker(period)
defer ticker.Stop()
for <- ticker.C {
...
}
Use:
ticker := time.NewTicker(period)
defer ticker.Stop()
for ; true; <- ticker.C {
...
}
for
–select
loop
Given something like this:
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
ticker := time.NewTicker(period)
defer ticker.Stop()
loop:
for {
select {
case <- ticker.C:
f()
case <- interrupt:
break loop
}
}
Use:
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)
ticker := time.NewTicker(period)
defer ticker.Stop()
loop:
for {
f()
select {
case <- ticker.C:
continue
case <- interrupt:
break loop
}
}
Why not just use time.Tick()
?
While Tick is useful for clients that have no need to shut down the Ticker, be aware that without a way to shut it down the underlying Ticker cannot be recovered by the garbage collector; it “leaks”.
https://golang.org/pkg/time/#Tick