我需要在x
秒之后运行一个函数,具有一些控制能力(重置计时器,停止计时器,找到剩余的执行时间)。 time.Timer
非常贴合 - 唯一缺少的是它似乎无法找到剩余的时间。
我有哪些选择?
目前,我正在想类似的事情:
package main
import "time"
type SecondsTimer struct {
T time.Duration
C chan time.Time
control chan time.Duration
running bool
}
func (s *SecondsTimer) run() {
for s.T.Seconds() > 0 {
time.Sleep(time.Second)
select {
case f := <-s.control:
if f > 0 {
s.T = f
} else {
s.running = false
break
}
default:
s.T = s.T - 1
}
}
s.C <- time.Now()
}
func (s *SecondsTimer) Reset(t time.Duration) {
if s.running {
s.control <- t
} else {
s.T = t
go s.run()
}
}
func (s *SecondsTimer) Stop() {
if s.running {
s.control <- 0
}
}
func NewSecondsTimer(t time.Duration) *SecondsTimer {
time := SecondsTimer{t, make(chan time.Time), make(chan time.Duration), false}
go time.run()
return &time
}
现在我可以根据需要使用s.T.Seconds()
。
但我对种族状况和其他类似问题保持警惕。这是要走的路,还是我可以使用更原生的东西?
答案 0 :(得分:2)
有一种更简单的方法。您仍然可以使用time.Timer
来完成您想要的工作,只需跟踪end time.Time
:
type SecondsTimer struct {
timer *time.Timer
end time.Time
}
func NewSecondsTimer(t time.Duration) *SecondsTimer {
return &SecondsTimer{time.NewTimer(t), time.Now().Add(t)}
}
func (s *SecondsTimer) Reset(t time.Duration) {
s.timer.Reset(t)
s.end = time.Now().Add(t)
}
func (s *SecondsTimer) Stop() {
s.timer.Stop()
}
所以剩下的时间很简单:
func (s *SecondsTimer) TimeRemaining() time.Duration {
return s.end.Sub(time.Now())
}