Go执行当前package下的所有方法
需求:需要一个文件一个定时任务方法,当项目初始化完毕后,自动加载并执行这些定时任务方法
项目目录架构
main.go 初始化
package main
import (
"sql_demo/schedule"
)
func main() {
/***
** 其他初始化完毕后的操作
**/
// 定时任务
schedule.Init()
select {}
}
schedule目录下
Init.go
package schedule
import (
"reflect"
"github.com/robfig/cron/v3"
)
var Job *cron.Cron
type ScheduleStruct struct{}
func Init() {
// cron.WithParser 必须有,否则 spec 时间不支持秒级
Job = cron.New(cron.WithParser(cron.NewParser(cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)))
// 执行本pakage下的所有方法
t := reflect.TypeOf(&ScheduleStruct{})
// 遍历结构体的所有方法
for i := 0; i < t.NumMethod(); i++ {
method := t.Method(i)
// 只执行公共方法
if method.PkgPath == "" {
// fmt.Printf("Executing method: %s\n", method.Name)
// 获取方法的函数值
methodValue := reflect.ValueOf(&ScheduleStruct{}).MethodByName(method.Name)
// 调用方法
methodValue.Call(nil)
}
}
Job.Start()
}
// 新增一个定时任务,可以指定是否禁用该任务。
// 参数:
// spec: 定时任务的时间规则字符串
// cmd: 定时任务要执行的函数
// disabled: 是否禁用该任务(当前未使用该参数)
func AddFunc(spec string, cmd func(), disabled bool) {
if disabled {
return
}
Job.AddFunc(spec, cmd)
}
everyMinutes.go
package schedule
func (s *ScheduleStruct) EveryMinutes() {
AddFunc("*/1 * * * * *", func() {
println("hello world")
}, true)
}
原理:利用反射原理和结构体方法来实现。