猿问

提前执行定时器功能

使用时time.AfterFunc,是否可以提前执行定时器功能,取消该功能的未来执行?

编辑:我能想到的最好的方法是保持一个函数指针与定时器平行,该指针指向与定时器注册的相同函数。然后您可以调用此函数并调用 timer.Stop()。不过,我的问题仍然存在:计时器是否有一种固有的方法可以做到这一点?


慕雪6442864
浏览 148回答 2
2回答

绝地无双

您可以简单地停止计时器并将其重置为零,使其立即触发:t := time.AfterFunc(d, f)// laterif t.Stop() {   t.Reset(0)}在操场上试试:https: //play.golang.org/p/yKBa0Mp_mUm注意需要检查stop的返回值,否则该函数可能会被多次调用:对于使用 AfterFunc(d, f) 创建的计时器,如果 t.Stop 返回 false,则计时器已经过期,并且函数 f 已在其自己的 goroutine 中启动。

慕标5832272

是的。根据AfterFunc(强调我的)的文档:AfterFunc 等待持续时间过去,然后在自己的 goroutine 中调用 f。它返回一个 Timer,可用于使用其 Stop 方法取消调用。至于如何提前实际执行函数,一旦定时器停止,就没有理由去想它了。你现在有一个想要执行的函数,所以现在就执行它,就像任何其他函数一样。t := time.AfterFunc(dur, fn)if t.Stop() {   go fn()}
随时随地看视频慕课网APP
我要回答