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)

}

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

相关推荐
GIS阵地17 分钟前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
yaoxin5211231 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy1 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
FF2501_940228581 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统
神奇小汤圆2 小时前
线程池的 DiscardPolicy 为什么是「静默杀手」?一个生产事故的完整复盘
后端
大鸡腿同学2 小时前
个人博主 AI 剪辑实操:口播视频 3 步出片,省 80% 剪辑时间
后端
小钻风33662 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李2 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
xianjixiance_2 小时前
HarmonyOS应用开发实战:萌宠日记 - 整体架构设计与技术选型解析
后端
掘金者阿豪2 小时前
数据库优化器到底在想什么:一个SQL今天能跑明天崩的背后
后端