Go 戈朗计时器从零开始重新计算

Go 戈朗计时器从零开始重新计算,go,timer,Go,Timer,我需要写一个计时器,它可能会自动重置为零。例如,我有一个 trm := time.NewTimer(10) 然后,如果某个事件在过期之前发生,计时器将清除它拥有的所有数据,并从0开始重新计算,就像我重新创建同一个计时器一样 我检查了Go的时间API,没有发现任何东西。有什么建议吗 谢谢。您可以使用定时器.复位功能来复位定时器。若要续订,请传递最初用作参数的相同持续时间。(在您的情况下10) 从软件包文档: 重置会将计时器更改为在持续时间d后过期。如果计时器处于活动状态,则返回true;如果计时

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

trm := time.NewTimer(10)
然后,如果某个事件在过期之前发生,计时器将清除它拥有的所有数据,并从0开始重新计算,就像我重新创建同一个计时器一样

我检查了Go的时间API,没有发现任何东西。有什么建议吗


谢谢。

您可以使用
定时器.复位功能来复位定时器。若要续订,请传递最初用作参数的相同持续时间。(在您的情况下
10

从软件包文档:

重置会将计时器更改为在持续时间d后过期。如果计时器处于活动状态,则返回true;如果计时器已过期或已停止,则返回false

因此,当您将相同的持续时间传递给
重置
时,计时器将从该持续时间d开始计数。您可以有效地
更新计时器

例如:

if eventHappened {
   timer.Reset(10)
}
你打算用什么

重置会将计时器更改为在持续时间d后过期。如果 计时器已激活,如果计时器已过期或已关闭,则为false 停下来

另一个解决方案是初始化另一个计时器

t.Reset(x)
t := time.NewTimer(x)
除了避免垃圾收集之外,其他都是相同的

下面是一个典型的例子。如果经过的时间小于超时时间,它将重置计时器

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    const timeout = 1 * time.Millisecond
    t := time.NewTimer(timeout)
    for {
        t2 := timeout + time.Duration(rand.Intn(100)-50)*timeout/100
        start := time.Now()
        select {
        case <-time.After(t2):
            fmt.Println("Time after:", t2)
        }
        elapsed := time.Since(start)
        if elapsed < timeout {
            fmt.Println("Time ellapsed:", elapsed)
            t.Reset(timeout)
        }        
    }
}
主程序包
进口(
“fmt”
“数学/兰德”
“时间”
)
func main(){
常数超时=1*时间。毫秒
t:=时间。新计时器(超时)
为了{
t2:=超时+时间持续时间(rand.Intn(100)-50)*超时/100
开始:=时间。现在()
挑选{

案例什么意思,你检查了go API,什么也没找到?如果你搜索“golang timer”,第一个结果是golang的时间包的官方标准库文档。
timer
类型只有两种方法,其中一种是
Reset
。这不是你想要的吗?我不确定Reset()将从0开始,或继续计时。@我已更新答案,以解决您的问题。