golang变相实现抽象类
golang里的struct只能有属性, interface只能有方法定义。这点在java里很好实现的abstract class在这里就不能直接实现, 可以通过struct和interface的结合定义,实现抽象类的类似的功能。
直接上代码:
代码都来之与项目
GitHub - golang fot xxl-job executor
在这个项目里,重构了executor和默认的RestfulExecutor的实现方式, 就是采用了上述的方式。
先定义接口 // executor 执行器 type executor interface { // Init // 初始化执行器 Init(opts ...Option) // Run 启动服务 Run() error // Registry 注册执行器到调度中心 Registry() // UnRegistry 从调度中心在注销执行器 UnRegistry() error // SetLogHandler 日志handler SetLogHandler(handler LogHandler) // Stop 停止服务 Stop() // RequestCallback 执行后回调请求给调度中心 RequestCallback(task *Task, code int64, msg string) // RegTask // 注册任务 RegTask(pattern string, task TaskFunc) }
然后定义我们需要的抽象类 type Executor struct { executor // private opts Options address string regList *taskPool //注册任务列表 runList *taskPool //正在执行任务列表 log log4go.Logger logHandler LogHandler //日志查询handler // inner _impl executor // 这里很关键,是实现抽象类的重要地方 } // 这里很关键,是实现抽象类的重要地方,封装一个wrap方法, func (e *Executor) wrap(_wrap executor) { e._impl = _wrap }
实现抽象类里的主要方法 func (e *Executor) Init(opts ...Option) { for _, o := range opts { o(&e.opts) } e.log = e.opts.logger e.regList = &taskPool{ data: make(map[string]*Task), } e.runList = &taskPool{ data: make(map[string]*Task), } e.address = e.opts.ExecutorIp + ":" + e.opts.ExecutorPort e.log.Info("%v %v", EXECUTOR4G_VERSION, e.address) go e.Registry() // 这里的Regstry是子类需要实现的方法 } // Registry 注册执行器到调度中心 func (e *Executor) Registry() { /// 用wrap方式把调用交换具体的子类 e._impl.Registry() }
子类实现 type RestFulExecutor struct { Executor mu sync.RWMutex } // Registry // 注册执行器到调度中心 func (e *RestFulExecutor) Registry() { t := time.NewTimer(time.Second * 0) //初始立即执行 defer t.Stop() .... }
最关键的地方,调用 func newExecutor(opts ...Option) executor { //var exec executor options := newOptions(opts...) if options.executorImpl == nil { // 变相的抽象类的实现 e := &RestFulExecutor{} e.wrap(e) // 最关键的地方,使用wrap把具体实现子类包装进返回接口 e.opts = options return e } else { return options.executorImpl } }
具体代码可以查看项目中的源码
项目地址
GitHub - gohutool/boot4go-xxljob-executor: golang fot xxl-job executor
推荐几个好工具 GitHub - gohutool/boot4go: a bootstrap framework for golang like as spring-boot
GitHub - gohutool/log4go: a logkit like as log4j with go language golang里的日志工具log4go - 知乎
golang中的表达式解析-expression4go 简单的EL - 知乎
做好搜索和收藏蜜雪冰城支付宝小程序日访问量环比暴增43倍奶茶品牌的竞争,正从性价比线下开店速度蔓延至对线上数字化运营手段的运用。继今年门店总量突破10000家后,蜜雪冰城正加速布局线上渠道,保持持续增长。8月16日,来自支付宝开放平台的
79。92!超特斯拉?五菱宏光MINIEV登顶自主新能源车保值率榜首最近,中国汽车流通协会联合相关机构发布了2021年上半年中国汽车保值率研究报告,报告中的车型全部为中国品牌的新能源车,在1年保值率排行中,五菱宏光MINIEV的保值率高达79。92
企业家驾驶蔚来车祸离世,被质疑的NOP领航功能到底是什么?记者李文博编辑8月14日,某个人公众号发布讣告称,上善若水投资管理公司创始人意统天下餐饮管理公司创始人美一好品牌管理公司创始人林文钦(昵称萌剑客)遭遇车祸丧生。讣告特别指出,驾驶人
曾经风靡一时的小米网红电动车,现在怎么样了?随着网络不断的发展以及自媒体的兴起,任何人任何物都有可能成为流量明星,而它们则被称为网红产品。两轮电动车作为一个草根产品,随着这几年大资本的介入,如今也培养出了不少的网红产品,尤其
电商迎来小圈热!上半年我国新增电商企业超57万家自2020年拼多多上线主打真实评价的产品拼小圈后,各大电商也纷纷上线了小圈类产品。据统计,除拼多多之外,淘宝目前上线了淘友圈,京东上线了京友圈,近期媒体报道显示,美团也开始了饭小圈
ZOL科技早餐微信支持切换2个以上帐号8月16日晨,为您推送的科技消息微信新增支持切换2个以上帐号在2018年,微信上线了双帐号切换。最近,微信iOS版8。0。10安卓版8。0。9已支持切换两个以上帐号,据验证至少可支
新手电商创业怎么谈到便宜的快递?主要考虑的几个问题1。怎么找快递公司?上策优先找快递公司总部咨询快递的网点合作,可以打电话或官网查询,找到关键人物谈。下策找周边菜鸟驿站合作,不过他们肯定会贵,大概78快左右。不过
NFT是什么!为何引得腾讯阿里等大厂纷纷入局?非同质代币(NFT)在2021年的前几个月进入公众视野。佳士得和苏富比等艺术品拍卖行能够以高价拍出数字艺术家BeepleLarvaLabs团队和许多人的作品。那么,为什么收藏家要为
阿里的事反转了吗?来源缓缓说01hr从通报的定性来说(犯罪嫌疑人王某文张某因涉嫌强制猥亵罪被刑拘),总体上没有反转,但此前网传控诉帖(这个帖子被发在了阿里内网,后来传了出来)的部分内容(强制出差强迫
Plainsight利用AI接手牲畜管理总部位于旧金山的初创公司Plainsight正在帮助肉类加工业改善其运营从农场到餐桌全覆盖。通过将Plainsight的视觉AI平台和NVIDIAGPU配对来开发视频分析应用程序,
手持小米11,是否有必要换成苹果12?个人觉得大家完全没有必要将自己的小米11这款手机换成苹果12,我给到的理由有以下几点大家不妨参考一下。理由一首先苹果13马上就要出了,你想要换一台苹果手机为什么不等待一下苹果12呢