time.Ticker用于周期性任务,如每2秒触发一次;2. time.Timer用于单次延迟执行,如1秒后触发;二者均需注意资源释放与并发安全。

在Go语言中,time.Ticker 和 time.Timer 是实现周期性任务和延时执行的常用工具。它们都基于 time 包,但用途不同:Timer 用于“未来某一时刻执行一次”,Ticker 用于“每隔一段时间重复执行”。下面分别介绍它们的使用方法和注意事项。
time.Ticker 用于周期性地触发事件,比如每5秒上报一次状态、每分钟检查一次服务健康等。
创建一个 Ticker 后,它会按照设定的时间间隔持续发送时间信号到其 Channel 中。
示例:每2秒打印一次当前时间
立即学习“go语言免费学习笔记(深入)”;
package main
<p>import (
"fmt"
"time"
)</p><p>func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop() // 避免资源泄漏</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for {
select {
case t := <-ticker.C:
fmt.Println("Tick at", t)
}
}}
关键点:
time.Timer 表示在未来某个时间点触发一次通知,常用于延迟操作或超时控制。
示例:1秒后执行打印
package main
<p>import (
"fmt"
"time"
)</p><p>func main() {
timer := time.NewTimer(1 * time.Second)</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"><-timer.C
fmt.Println("Timer expired")}
常见用途:
示例:带超时的 channel 操作
select {
case msg := <-ch:
fmt.Println("Received:", msg)
case <-time.After(2 * time.Second):
fmt.Println("Timeout, no message received")
}
注意: time.After(d) 内部创建了一个 Timer 并返回其 Channel,适合一次性超时场景。如果频繁使用建议手动管理 Timer 以避免资源浪费。
根据任务类型决定使用哪一个:
进阶技巧:可控的周期任务
func startTask() {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for {
select {
case <-ticker.C:
fmt.Println("Running periodic task...")
// 执行具体任务
case <-stopCh:
fmt.Println("Stopping task...")
return
}
}}
通过传入 stopCh 可优雅关闭周期任务。
基本上就这些。掌握好 Ticker 和 Timer 的区别与用法,能有效处理Go中的时间相关逻辑,关键是记得及时 Stop,避免泄露。
以上就是Golangtime/ticker周期任务与定时器使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号