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)

}

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

相关推荐
程序 代码狂人38 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
m0_639906941 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
meiying88382 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
holly就是我2 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
鸿蒙开发2 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
用户788477316342 小时前
小程序后端三选一:云开发、.NET WebAPI、Node,我按客户现状分了三种答案
后端
aiopencode2 小时前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
智驭未来掌门人2 小时前
CLion 开发 Qt 项目的优势
后端
EnCi Zheng3 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
Bazingga3 小时前
从一家酒店讲懂Docker
后端