Go执行当前package下的所有方法

需求:需要一个文件一个定时任务方法,当项目初始化完毕后,自动加载并执行这些定时任务方法

项目目录架构

main.go 初始化

Go 复制代码
package main

import (
	"sql_demo/schedule"
)

func main() {
	 
	/***
	** 其他初始化完毕后的操作
	**/

	// 定时任务
	schedule.Init()

	select {}

}

schedule目录下

Init.go

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

Go 复制代码
package schedule

func (s *ScheduleStruct) EveryMinutes() {

	AddFunc("*/1 * * * * *", func() {
		println("hello world")
	}, true)

}

原理:利用反射原理和结构体方法来实现。

相关推荐
小信啊啊8 分钟前
Go语言切片slice
开发语言·后端·golang
阿华hhh10 分钟前
Linux系统编程(标准io)
linux·开发语言·c++
南_山无梅落23 分钟前
9.Python3集合(set)增删改查和推导式
java·开发语言
sg_knight39 分钟前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm
程序喵大人1 小时前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
阿里嘎多学长1 小时前
2025-12-16 GitHub 热点项目精选
开发语言·程序员·github·代码托管
乂爻yiyao1 小时前
Java LTS版本重要升级特性对照表
java·开发语言
原来是好奇心2 小时前
深入Spring Boot源码(六):Actuator端点与监控机制深度解析
java·开发语言·源码·springboot
Victor3562 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易2 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee