3 回答
TA贡献1878条经验 获得超4个赞
不幸的是,Go 开发人员似乎不会在任何可预见的未来添加这样的功能,所以我们必须应对......
有两种常用的代码使用方法:
for 环形
鉴于这样的事情:
ticker := time.NewTicker(period)
defer ticker.Stop()
for <- ticker.C {
...
}
用:
ticker := time.NewTicker(period)
defer ticker.Stop()
for ; true; <- ticker.C {
...
}
for-select循环
鉴于这样的事情:
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
}
}
用:
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
}
}
为什么不直接使用time.Tick()?
尽管 Tick 对于不需要关闭 Ticker 的客户端很有用,但请注意,如果无法关闭它,则垃圾收集器无法恢复底层的 Ticker;它“泄漏”。
https://golang.org/pkg/time/#Tick
TA贡献1784条经验 获得超9个赞
ticker := time.NewTicker(period)
for ; true; <-ticker.C {
...
}
https://github.com/golang/go/issues/17601
TA贡献1880条经验 获得超4个赞
Ticker内部的实际实现是相当复杂的。但是你可以用一个 goroutine 包装它:
func NewTicker(delay, repeat time.Duration) *time.Ticker {
ticker := time.NewTicker(repeat)
oc := ticker.C
nc := make(chan time.Time, 1)
go func() {
nc <- time.Now()
for tm := range oc {
nc <- tm
}
}()
ticker.C = nc
return ticker
}
- 3 回答
- 0 关注
- 153 浏览
添加回答
举报