package main import ( "fmt" "time" ) // GetDateTime 获取当前时间的日期时间字符串 // @return string 日期时间字符串 func GetDateTime() string { var location, _ = time.LoadLocation("Asia/Shanghai") return time.Unix(time.Now().In(location).Unix(), 0).In(location).Format("2006-01-02 15:04:05") } func main() { ticker := time.NewTicker(time.Second) // 创建Ticker,NewTicker()的参数就是定时执行任务的频率 counter := 0 tickerStopChan := make(chan bool) // 由于“for range ticker.C”是死循环,所以使用协程执行定时任务防止发生阻塞 go func() { for range ticker.C { counter++ fmt.Printf("[%+v] 第%+v次执行 \n", GetDateTime(), counter) if counter >= 5 { ticker.Stop() // 停止Ticker tickerStopChan <- true // 向管道发送数据 break } } }() fmt.Println("Ticker已启动") // 由于是用协程执行定时任务,所以必须阻止main()退出,直到定时任务执行完才退出 ForLabel: // 设置for循环的标签 for { select { case stop, ok := <-tickerStopChan: // 从管道接收数据 { if ok == true && stop == true { fmt.Println("Ticker已停止") break ForLabel // 终止for循环,这是for-select-case结构跳出循环的特定写法 } } default: { // TODO... } } } //========== 输出流程 ==========// // Ticker已启动 // [2008-08-08 08:08:08] 第1次执行 // [2008-08-08 08:08:09] 第2次执行 // [2008-08-08 08:08:10] 第3次执行 // [2008-08-08 08:08:11] 第4次执行 // [2008-08-08 08:08:12] 第5次执行 // Ticker已停止 } //========== 总结 ==========// // 1、Go里的Ticker相当于JavaScript里的setInterval(),就是定时执行任务。 // 2、Ticker和Timer一样也有Stop()方法和Reset()方法来实现停止和重置定时任务。
Copyright © 2024 码农人生. All Rights Reserved