目录

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)

}

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
溟洵几秒前
【MySQL】事务是个啥?(一文带你了解 为什么要有事务、事务在mysql中的出现情况以及事务的四大特性)
linux·运维·数据库·后端·mysql
谦行7 分钟前
前端视角 Java Web 入门手册 4.4:Web 开发基础—— Java Bean
java·后端
可问 可问春风9 分钟前
JavaScript 性能优化实战指南
开发语言·javascript·性能优化
API快乐传递者15 分钟前
使用 Python 爬取微店关键词搜索接口(micro.item_search)的完整指南
开发语言·python
island131422 分钟前
【QT】文件系统相关 -- QFile
开发语言·qt
liqiang1268932 分钟前
python小白学习路径
开发语言·python·学习
User_芊芊君子32 分钟前
【Java】——运算符详解
java·开发语言
羑悻的小杀马特33 分钟前
DeepSeek 助力 C++ 开发:探索智能编程新境界
开发语言·c++·人工智能·ai大模型·deepseek
代码AC不AC1 小时前
【C语言】编译和链接详解
c语言·开发语言·链接·编译·深度解析
小蒜学长1 小时前
房屋交易平台设计与实现(代码+数据库+LW)
开发语言·数据库·spring boot·后端·oracle