3 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
不幸的是,Go 開(kāi)發(fā)人員似乎不會(huì)在任何可預(yù)見(jiàn)的未來(lái)添加這樣的功能,所以我們必須應(yīng)對(duì)......
有兩種常用的代碼使用方法:
for 環(huán)形
鑒于這樣的事情:
ticker := time.NewTicker(period)
defer ticker.Stop()
for <- ticker.C {
...
}
用:
ticker := time.NewTicker(period)
defer ticker.Stop()
for ; true; <- ticker.C {
...
}
for-select循環(huán)
鑒于這樣的事情:
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 對(duì)于不需要關(guān)閉 Ticker 的客戶(hù)端很有用,但請(qǐng)注意,如果無(wú)法關(guān)閉它,則垃圾收集器無(wú)法恢復(fù)底層的 Ticker;它“泄漏”。
https://golang.org/pkg/time/#Tick

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
ticker := time.NewTicker(period)
for ; true; <-ticker.C {
...
}
https://github.com/golang/go/issues/17601

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
Ticker內(nèi)部的實(shí)際實(shí)現(xiàn)是相當(dāng)復(fù)雜的。但是你可以用一個(gè) 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 關(guān)注
- 182 瀏覽
添加回答
舉報(bào)