Go语言:如何让Ticker在函数启动时立即触发执行指定任务?
解决方案:让Ticker首次触发立即执行
嘿,这个问题我太懂了!time.NewTicker默认是先等待指定间隔才会第一次触发,确实会导致启动初期的输出不符合预期,而且手动提前打印又不够优雅。这里有个完全基于通道机制的优雅解决办法,不用额外手动打印,完美实现你要的顺序:
核心思路
我们不直接使用Ticker自带的通道,而是自己封装一个通道——在启动Ticker的同时,先立即发送一次初始信号,之后再把Ticker后续的触发信号转发到这个自定义通道里。这样程序启动时,select会优先接收到这个初始信号,先执行"weekly updated",然后按预期循环下去。
修改后的完整代码
package main import "time" import "fmt" func main() { var a int // 自定义一个带初始触发的定时器通道 timeChan := make(chan time.Time) go func() { // 先立即发送一次初始信号,触发第一次weekly更新 timeChan <- time.Now() // 启动Ticker,后续每2秒转发一次信号 ticker := time.NewTicker(time.Second * 2) defer ticker.Stop() // 好习惯:记得释放定时器资源 for t := range ticker.C { timeChan <- t } }() tickChan := time.NewTicker(time.Millisecond * 500).C for { select { case <-timeChan: fmt.Println("weekly updated") a = 1 case <-tickChan: if a == 1 { fmt.Println("daily check") } else { fmt.Println("Not update?") } } } }
输出效果
运行后会直接得到你想要的顺序:
weekly updated daily check daily check daily check daily check weekly updated daily check daily check daily check daily check ……
为什么这个方案优雅?
- 完全遵循Go的通道并发模型,没有引入额外的控制逻辑
- 不需要手动提前打印,所有触发逻辑都封装在通道的初始化里
- 保留了原代码的结构,改动很小,可读性高
内容的提问来源于stack exchange,提问作者Yang MingHui
相关产品推荐
相关产品推荐

