在 go Cron 中,AddFunc 函数用于添加一个定时任务。要设置每小时执行一次,你可以使用 Every(1).Hour() 这个方法。
下面是如何使用 AddFunc 函数设置每小时执行一次的示例:go
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3" // 确保你已经安装了这个库
)
func main() {
// 创建一个新的cron实例
c := cron.New()
// 添加一个定时任务,每小时执行一次
// Cron的秒、分、时、日、月、周的格式是: "秒 分 时 日 月 周"
// "0 * * * * ?" 表示每小时的第0秒执行
// 或者更直观地使用 Every() 方法
spec := "0 * * * * ?" // 每小时的第0秒执行 (分钟和小时都会滚动)
_, err := c.AddFunc(spec, func() {
fmt.Println("This runs every hour at the start of the hour!")
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 使用 Every() 方法更简洁地设置每小时执行
_, err = c.AddFunc("@hourly", func() {
fmt.Println("This also runs every hour using @hourly specifier!")
})
if err != nil {
fmt.Println("Error adding cron job:", err)
return
}
// 启动cron调度器
c.Start()
// 让程序运行一段时间,否则cron调度器会立即退出
fmt.Println("Cron scheduler started. Press Ctrl+C to exit.")
select {} // 阻塞程序,直到收到中断信号
}
解释:
1. cron.New(): 创建一个新的 cron 调度器实例。
2. c.AddFunc(spec, cmd): 这是核心函数。
* spec: 这是一个字符串,用于指定任务的执行时间。
* cmd: 这是一个 func() 类型的匿名函数,当定时任务触发时会被执行。
关于 spec 的设置,有两种主要方式来实现每小时执行:
方式一:使用标准的 cron 时间表达式
* "0 * * * * ?":
* 0: 表示在每小时的 第 0 秒 执行。
* *: 表示每分钟都执行。
* *: 表示每天都执行。
* *: 表示每月的每一天都执行。
* *: 表示每年的每一个月都执行。
* ?: 表示星期几不指定(通常与日字段互斥,使用 * 或 ? 都可以,但 ? 更清晰表示不关心星期几)。
注意: 这种方式的意思是,在每一分钟的第0秒执行。由于分钟会滚动,所以它实际上会每小时的第0分钟、第1分钟、第2分钟… 执行。这 不是 每小时执行一次,而是每分钟执行一次。
要真正实现每小时执行一次,你需要更精确的表达式:
* "0 0 * * * ?": 这会在 每小时的第0分钟的第0秒 执行。这确实是每小时执行一次。
方式二:使用预定义的特殊表达式(推荐,更简洁)go Cron (v3) 库支持一些预定义的特殊表达式,它们更易于阅读和使用:
* "@hourly": 这是最直接、最推荐的方式来设置每小时执行一次。它会自动在每小时的开始执行(通常是第0分钟的第0秒)。
代码示例中演示了两种方式:
1. spec := "0 * * * * ?" (这是一个错误示范,它会导致每分钟执行,而不是每小时)
2. c.AddFunc("@hourly", ...) (这是正确的、推荐的方式)
如何选择:
* 对于 每小时执行一次,强烈建议使用 "@hourly",因为它最清晰、最易懂。
* 如果你需要更复杂的、非标准的时间间隔(例如:每隔15分钟,或者在特定时间的某个分钟),那么就需要学习和使用标准的 cron 时间表达式。
运行代码:
1. 安装库:
bash
go get github.com/robfig/cron/v3
2. 运行代码:
bash
go run your_file_name.go
你会看到输出,每小时(在整点)会打印一次 “This runs every hour at the start of the hour!” 和 “This also runs every hour using @hourly specifier!“。