🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 语言中,Ticker 是一个用于定期执行某些操作的工具。它属于 time 包,提供了一种简单的方法来处理定时任务,适用于需要周期性执行的场景。
💻代码
package main
import (
"fmt"
"time"
)
func main() {
// 创建一个 Ticker,每秒触发一次
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop() // 用 defer 确保在 main 函数结束时停止它。
// 启动一个 goroutine 来处理 Ticker
go func() {
//使用 for 循环从 ticker.C 接收时间信号,并打印每次触发的时间。
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}()
// 模拟一些工作
time.Sleep(5 * time.Second)
fmt.Println("Stopping the ticker...")
// 停止 Ticker,将停止发送信号到通道 C。
ticker.Stop()
}
//输出
//Tick at 2024-11-11 14:28:42.510614942 +0800 CST m=+1.000234620
//Tick at 2024-11-11 14:28:43.510633219 +0800 CST m=+2.000234257
//Tick at 2024-11-11 14:28:44.51065133 +0800 CST m=+3.000234105
//Tick at 2024-11-11 14:28:45.510671323 +0800 CST m=+4.000234743
//Stopping the ticker...
🔍理解
- Timer函数一般用于一次定时任务,Ticker函数用于周期性的定时任务
- Ticker 适用于需要定期执行的任务,例如定时检查状态、定期发送心跳等。
- 使用 goroutine 处理 Ticker 的触发,使得主程序可以继续执行其他操作。
- 使用 Stop() 方法可以安全地停止 Ticker,避免在不再需要时继续占用资源
- 使用 time.NewTicker 函数创建一个新的 Ticker。该函数接受一个 time.Duration 类型的参数,表示每次触发的间隔时间。
💡 Tips小知识点
经典场景
package main
import (
"fmt"
"time"
)
func main() {
// 创建一个 Ticker,每 500 毫秒触发一次
ticker := time.NewTicker(500 * time.Millisecond)
done := make(chan bool) // 创建一个用于通知停止的通道
// 启动一个 goroutine 来处理 Ticker
go func() {
for {
select {
case <-done: // 如果接收到停止信号,退出循环
return
case t := <-ticker.C: // 从 Ticker 的通道接收时间信号
fmt.Println("Tick at", t) // 打印当前时间
}
}
}()
// 主 goroutine 暂停 1600 毫秒
time.Sleep(1600 * time.Millisecond)
ticker.Stop() // 停止 Ticker
done <- true // done <- true // 发送信号,通知 goroutine 停止
fmt.Println("Ticker stopped") // 打印停止消息
}
//输出
//Tick at 2024-11-11 14:32:10.746581931 +0800 CST m=+0.500304237
//Tick at 2024-11-11 14:32:11.246590386 +0800 CST m=+1.000303450
//Tick at 2024-11-11 14:32:11.746599522 +0800 CST m=+1.500303668
//Ticker stopped
- done <- true 和 done <- false 都是向通道发送信号的操作。
- true 通常表示停止或完成,而 false 可以表示继续或保持状态。
- 使用 done 通道来安全地停止 goroutine,避免直接使用 os.Exit 或其他强制退出的方法。
💪无人扶我青云志,我自踏雪至山巅。