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 關注
- 189 瀏覽
添加回答
舉報