我试图创建一个函数,它会在每小时的时间内准确返回一个值。我下面的代码到目前为止,但是我能采取更好的方法吗?
func main() {
for {
t := time.Now()
if t.Minute() == 00 {
fmt.Println("Hello World!")
}
time.Sleep(1 * time.Minute)
}
}
答案 0 :(得分:3)
您可以使用时间包AfterFunc功能。
time.AfterFunc(time.Hour * 1, func() {
// Do something!
})
它返回一个Timer,可用于使用Stop方法取消呼叫。第一次调用你可能需要计算到下一个小时的剩余时间,以便每次调用都在你想要的时间。
答案 1 :(得分:0)
如果您想以分钟/秒0
完全开始操作,那么在Go中截断到一小时有点棘手。
时间每次都会移动一点,因为所有关于时序的保证条件至少(例如time.Sleep(d)
至少在d
时间内休眠;不是完全d
)。
根据这些要求,此代码执行任务:
func main() {
timer := time.NewTimer(nextDelay())
for {
<-timer.C
timer.Reset(nextDelay())
time.Sleep(time.Minute * 59) // the task, or you could do more tricks with channels
}
}
func nextDelay() time.Duration {
now := time.Now()
return truncateHour(now).Add(time.Hour).Sub(now)
}
func truncateHour(t time.Time) time.Time {
t = t.Truncate(time.Minute * 30)
if t.Minute() > 0 {
t = t.Add(time.Minute * -1).Truncate(time.Minute * 30)
}
return t
}