go-cronjob并非官方或主流调度库,实际多为gocron(jasonlvhit/gocron)的误写或轻量封装;使用gocron v1.14+需注意默认utc时区,应显式调用setlocation设置本地时区。

Go-cronjob 不是 Go 官方库,也不是社区主流调度方案(比如 robfig/cron 或 aurora/aurora),它不是一个被广泛采用、持续维护的成熟库。如果你在项目里看到或想用 go-cronjob,大概率是指某个小众 fork、内部封装,甚至可能是拼写混淆(比如把 gocron 误写成 go-cronjob)。
确认你实际用的是哪个库:gocron 还是自研封装?
搜索 GitHub 或 go.dev 会发现,真正稳定可用、文档齐全、Star 数过千的是 gocron(作者 jasonlvhit/gocron)。而 go-cronjob 几乎没有权威仓库或版本发布记录。很多团队所谓“用 go-cronjob”,其实是基于 gocron 做了轻量封装,加了配置加载、任务注册表、HTTP 管理接口等。
- 执行
go list -m all | grep cron查看实际依赖项,确认模块名是不是github.com/jasonlvhit/gocron - 检查
go.mod中是否引入了未知来源的go-cronjob—— 这类包往往无 tag、无测试、无更新,不建议直接上线 - 如果只是名字叫
go-cronjob但代码里 import 的是gocron,那本质还是gocron,别被命名误导
用 gocron 启动一个基础定时任务(v1.14+ 推荐写法)
gocron v1.14 起默认使用单例模式,不再需要显式传入 scheduler 实例,更贴近 “开箱即用” 的直觉。但要注意它的默认时区是 UTC,不是本地时区 —— 这是线上出问题最常见原因。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
package main
import (
"fmt"
"time"
"github.com/jasonlvhit/gocron"
)
func main() {
// 每 5 秒打印一次,注意:这是 UTC 时间
gocron.Every(5).Second().Do(func() {
fmt.Println("task run at", time.Now().Format("2006-01-02 15:04:05"))
})
// 如果要按本地时区(比如东八区),必须显式设置 Location
loc, _ := time.LoadLocation("Asia/Shanghai")
gocron.SetLocation(loc)
// 启动调度器(阻塞式)
-
gocron.Every(n)后必须接单位方法(.Second()/.Minute()/.Day()等),漏掉会 panic -
gocron.Start()返回chan struct{},用于等待退出;不要用time.Sleep模拟阻塞,否则可能提前结束 - 函数内不能直接用
log.Fatal或os.Exit,否则整个调度器崩溃,所有任务停摆
在 Gin / Echo 等 Web 框架中安全集成调度器
后端服务常需同时提供 HTTP 接口和后台定时任务。关键点在于:调度器生命周期必须与 HTTP Server 对齐,且避免重复启动(比如热重载或 test 中多次调用 main())。
- 用 sync.Once 或 init 标记确保
gocron只初始化一次,尤其在单元测试中容易触发多次 - Web server shutdown 时应调用
gocron.Stop(),否则 goroutine 泄漏(v1.14+ 支持该方法) - 不要把任务函数写成闭包引用 handler 实例(如
func() { h.doX() }),除非你确保h在整个生命周期存活;更推荐解耦为独立函数或传参构造 - 若需动态增删任务(比如管理后台操作),要用
gocron.AddJob+gocron.RemoveJob,而非反复调用Every().Do()—— 后者每次都会新建 job,旧 job 不自动清理
为什么不用 go-cronjob 而选 gocron 或其他替代?
真正影响选型的不是名字,而是三点:可观察性、错误恢复能力、上下文支持。比如 gocron 默认不捕获任务 panic,一次 panic 就会让整个调度链中断;而 robfig/cron/v3 支持 WithChain(cron.Recover(cron.DefaultLogger)) 自动兜底。
-
gocron优点:API 简洁、中文文档友好、适合中小项目快速上手 -
robfig/cron优点:支持 crontab 表达式、内置 logger 和 recover、生态更久经考验 - 真需要高可靠(如金融级调度),得上外部系统(如 Quartz + DB + UI),Go 内存态调度器本质是 best-effort,机器重启就丢任务
所谓 “go-cronjob” 如果没提供比上述两者更明确的价值(比如内置 etcd 分布式锁、Prometheus metrics 暴露、任务幂等标记),基本没必要额外引入。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










