猿问

golang计时器从零重新计算

我需要写一个计时器,它可能会重置为零。例如,我有一个

trm := time.NewTimer(10)

然后,如果在它到期之前发生了什么,计时器将清除它拥有的所有数据,并从 0 重新计算,就像我重新创建同一个计时器一样。

我检查了 Go 的时间 API,并没有找到任何东西。有小费吗?

谢谢。


慕婉清6462132
浏览 238回答 2
2回答

忽然笑

要用time.Reset什么?重置将计时器更改为在持续时间 d 后到期。如果计时器已激活,则返回 true,如果计时器已过期或已停止,则返回 false。另一种解决方案是初始化另一个计时器。t.Reset(x)t := time.NewTimer(x)是相同的,除了避免垃圾收集。一个典型的例子如下。如果经过的时间小于超时,它将重置计时器。package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "math/rand"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; const timeout = 1 * time.Millisecond&nbsp; &nbsp; t := time.NewTimer(timeout)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; t2 := timeout + time.Duration(rand.Intn(100)-50)*timeout/100&nbsp; &nbsp; &nbsp; &nbsp; start := time.Now()&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-time.After(t2):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Time after:", t2)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; elapsed := time.Since(start)&nbsp; &nbsp; &nbsp; &nbsp; if elapsed < timeout {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Time ellapsed:", elapsed)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t.Reset(timeout)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }}

慕码人8056858

您可以使用timer.Reset函数来重置计时器。要更新它,请传递最初用作参数的相同持续时间。(在你的情况下10)从包文档:重置将计时器更改为在持续时间 d 后到期。如果计时器已激活,则返回 true,如果计时器已过期或已停止,则返回 false。因此,当您将相同的持续时间传递给 时Reset,计时器将从该持续时间 d 开始计数。你有效地renew计时器。例如:if eventHappened {&nbsp; &nbsp;timer.Reset(10)}
随时随地看视频慕课网APP

相关分类

Go
我要回答