是否可以每天中午执行代码?该程序将在其余的运行时间中处理用户输入,但需要在中午运行一个函数以输出一些文本。最有效的方法是什么?
因此,您需要间隔计时器每天每天中午运行一项功能,您可以使用: timer.AfterFunc() 或time.Tick()或time.Sleep()或time.Ticker
timer.AfterFunc()
time.Tick()
time.Sleep()
time.Ticker
首先,在程序启动时,计算直到下一个正午的启动时间间隔,并使用一些等待(例如time.Sleep或…),然后24 * time.Hour在下一个间隔中使用 间隔。
time.Sleep
24 * time.Hour
示例代码使用time.Sleep:
package main import "fmt" import "time" func noonTask() { fmt.Println(time.Now()) fmt.Println("do some job.") } func initNoon() { t := time.Now() n := time.Date(t.Year(), t.Month(), t.Day(), 12, 0, 0, 0, t.Location()) d := n.Sub(t) if d < 0 { n = n.Add(24 * time.Hour) d = n.Sub(t) } for { time.Sleep(d) d = 24 * time.Hour noonTask() } } func main() { initNoon() }
并且您可以将main更改为此(或您需要的任何内容):
func main() { go initNoon() // do normal task here: for { fmt.Println("do normal task here") time.Sleep(1 * time.Minute) } }
使用timer.AfterFunc:
timer.AfterFunc
package main import ( "fmt" "sync" "time" ) func noonTask() { fmt.Println(time.Now()) fmt.Println("do some job.") timer.AfterFunc(duration(), noonTask) } func main() { timer.AfterFunc(duration(), noonTask) wg.Add(1) // do normal task here wg.Wait() } func duration() time.Duration { t := time.Now() n := time.Date(t.Year(), t.Month(), t.Day(), 12, 0, 0, 0, t.Location()) if t.After(n) { n = n.Add(24 * time.Hour) } d := n.Sub(t) return d } var wg sync.WaitGroup
使用time.Ticker:
package main import ( "fmt" "sync" "time" ) var ticker *time.Ticker = nil func noonTask() { if ticker == nil { ticker = time.NewTicker(24 * time.Hour) } for { fmt.Println(time.Now()) fmt.Println("do some job.") <-ticker.C } } func main() { timer.AfterFunc(duration(), noonTask) wg.Add(1) // do normal task here wg.Wait() } func duration() time.Duration { t := time.Now() n := time.Date(t.Year(), t.Month(), t.Day(), 12, 0, 0, 0, t.Location()) if t.After(n) { n = n.Add(24 * time.Hour) } d := n.Sub(t) return d } var wg sync.WaitGroup