Gone框架介绍13 - Gone的Hook函数

我从头到尾实现了一个Golang的依赖注入框架,并且集成了gin、xorm、redis、cron、消息中间件等功能;自己觉得还挺好用的,推荐给你!也欢迎一起维护!
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/
如果可能,请帮忙在github上点个 ⭐️ ;万分感谢!!

文章目录

    • 什么是Hook函数
    • 看一段代码
      • Hook函数遵循以下规则
    • Gone的启动流程

什么是Hook函数

在Gone的启停过程中,支持注册4种类型的函数,这个些函数会在特定时机被执行,被称为Hook函数。

  • BeforeStart Hook函数,在Gone启动前执行,通过BeforeStart注册
  • AfterStart Hook函数,在Gone启动后执行,通过AfterStart注册
  • BeforeStop Hook函数,在Gone停止前执行,通过BeforeStop注册
  • AfterStop Hook函数,在Gone停止后执行,通过AfterStop注册

看一段代码

package mainimport "github.com/gone-io/gone"type Worker struct {gone.FlagName string
}type Boss struct {gone.FlagName string
}func main() {gone.Prepare(func(cemetery gone.Cemetery) error {cemetery.Bury(&Boss{Name: "Jim"}, "boss-jim")cemetery.Bury(&Worker{Name: "Bob"}, "worker-bob")return nil}).BeforeStart(func() {println("第1个 BeforeStart 函数")}).BeforeStart(func(in struct {worker Worker `gone:"worker-bob"`boss   Boss   `gone:"*"`}) {println("第2个 BeforeStart 函数")println("boss:", in.boss.Name)println("worker:", in.worker.Name)}).BeforeStart(func() error {println("第3个 BeforeStart 函数")return nil}).Run()
}

上面代码代码的执行结果如下:

第3个 BeforeStart 函数
第2个 BeforeStart 函数
boss: Jim
worker: Bob
第1个 BeforeStart 函数

Hook函数遵循以下规则

  1. 同一种类型的Hook函数可以多次注册;
  2. BeforeStartBeforeStop Hook 函数,先注册的后执行;
  3. AfterStartAfterStop Hook 函数,先注册的先执行;
  4. 通过gone.Prepare(priest)返回的Preparer对象注册Hook 函数,支持链式调用;
  5. Preparer对象注册Hook 函数,函数支持多种类型:
    • 入参
      • 无参数
      • 匿名结构体参数,属性设置gone标签会被自动注入响应的值
    • 出参
      • 无出参
      • error参数,如果error参数不为nil,程序执行到该Hook时会抛出panic,终止运行

Gone的启动流程

  1. 复活所有埋葬的Goners
  2. 执行所有先知Goners的AfterRevive方法
  3. 天使Start方法注册为BeforeStart Hook函数;将天使Stop方法注册为BeforeStop Hook 函数;
  4. 业务代码注册 Hook 函数
  5. 按顺序执行 BeforeStart Hook 函数
  6. 按顺序执行 AfterStart Hook 函数
  7. 等待程序结束
  8. 按顺序执行BeforeStop Hook 函数
  9. 按顺序执行AfterStop Hook 函数

上一篇:Gone框架介绍12 - 通过内置Goners支持数据库操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835179.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.3 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码,请用go语言。 文心一言: 首先,让我们明确一点:由于您没有提供具体的图18-8(f)的内容,我只能假设它是一个数据结构(可能是图、树或列表等&…

AI模型:windows本地运行下载安装ollama运行Google CodeGemma、gemma等可离线运行数据模型【自留记录】

AI模型:windows本地运行下载安装ollama运行Google CodeGemma可离线运行数据模型【自留记录】 CodeGemma 没法直接运行,需要中间软件。下载安装ollama后,使用ollama运行CodeGemma。 类似 前端本地需要安装 node.js 才可能跑vue、react项目 1…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址,类似于 www.baidu.com。网络上的服务器想要访问它,就得需要它对应的 IP 地址,同时,每个域名对对应着一个 / N个 IP 地址(即对应多台服务器)。 因此,为了…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击(Session Hijacking)是一种网络攻击方式,攻击者通过某种手段获取到用户的会话标识(Session ID),然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲--ARM异常中断返回

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

智慧公厕解决什么问题?实现了什么样的价值?

公共厕所一直是城市管理的难题,常常面临着卫生条件不佳、管理不善以及使用体验差等问题。为了解决这些困扰城市的难题,智慧公厕应运而生。智慧公厕不仅应用了信息化和数字化技术,还通过全方位的智能化应用,彻底改变了传统公厕的面…

iframe的替代方案有吗?做页面嵌套界面套娃

UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家…

韩顺平0基础学Java——第8天

p155-168 数组(第六章) 数组可以存放多个同一类型的数据,数组也是一种数据类型(引用类型)。 即,数组就是一组数据~ 例:double [] hens {1,2,3,4,5,6}; 新建了一组鸡,里面有6个。…

【Leetcode】 top100 round2 直接开背版

25 K个一组翻转数组 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 思路&#xff…

车载电子电器架构 —— 应用软件开发(上)

车载电子电器架构 —— 应用软件开发(上) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

学习记录:AUTOSAR R20-11的阅读记录(五)【CP(5.11-5.19)】完

接上回:学习记录:AUTOSAR R20-11的阅读记录(四)【CP(5.6-5.10)】 五、CP 11、General(4个) 5.11 File Name 说明 1 AUTOSAR_EXP_ LayeredSoftwareArchitecture.pdf 描述了AUTO…

代码随想录算法训练营第二十四天|235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

##递归法class Solution:def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:if not root:return TreeNode(val)#向左遍历if val > root.val: root.right self.insertIntoBST(root.right,val) #1#向右遍历elif val < root.val:…

【HMWeb】HTML使用Leaflet实现本地离线地图Gis应用

下载Leaflet 官网下载&#xff1a;https://leafletjs.com/reference.html CSDN&#xff1a;https://download.csdn.net/download/hmxm6/89291989 选择版本号 添加html文件 加入代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

记一次DNS故障导致用户无法充值的问题(下)

上一篇说到DNS故障导致无法充值&#xff0c;后来我们通过拨测发现业务域名的解析目标地址被解析到了【127.0.0.1】IP。 1、联系阿里云厂商&#xff0c;通过沟通&#xff0c;阿里云反馈我们的域名被XX省通管单位封禁了&#xff0c;导致解析到了不正确的地址。 2、为了解决用户问…

【hackmyvm】 Animetronic靶机

靶机测试 arp-scanporturl枚举exiftool套中套passwordsudo 提权 arp-scan arp-scan 检测局域网中活动的主机 192.168.9.203 靶机IP地址port 通过nmap扫描&#xff0c;获取目标主机的端口信息 ┌──(root㉿kali)-[/usr/share/seclists] └─# nmap -sT -sV -O 192.16…

大数据ETL工具kettle-spoon

大数据ETL工具kettle-spoon9.4&#xff0c;主要提供数据抽取、转换、加载功能。 下载地址&#xff1a;https://download.csdn.net/download/xsfqh/89292236

P1802 5 倍经验日

题目描述: 现在 absi2011 拿出了 &#x1d465;x 个迷你装药物&#xff08;嗑药打人可耻…&#xff09;&#xff0c;准备开始与那些人打了。 由于迷你装药物每个只能用一次&#xff0c;所以 absi2011 要谨慎的使用这些药。悲剧的是&#xff0c;用药量没达到最少打败该人所需的…

【数据库】SELECT 语句的完整指南

在 MySQL 数据库中&#xff0c;SELECT 语句是最常用的查询工具之一。它允许用户从一个或多个表中检索数据&#xff0c;并可以应用各种条件、排序、聚合和其他操作。本文将介绍 MySQL 中 SELECT 语句的各种用法&#xff0c;包括基本语法、条件筛选、聚合函数、排序、分组、多表连…

Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;方法区&#xff08;Method Area&#xff09;是一个特殊的内存区域&#xff0c;用于存储类信息、常量、静态变量以及编译后的代码等。从Java 8开始&#xff0c;方法区的概念发生了一些变化&#xff0c;其中一些功能被转移…

谷歌搅局AI制药,进击的AlphaFold3模型 | 最新快讯

AI制药角逐战。 文&#xff5c;氨基观察 结构生物学是生物学的核心领域之一&#xff0c;其核心任务是揭示生物分子的三维结构&#xff0c;这对于理解其功能和行为至关重要。 传统的结构测定方法&#xff0c;如X射线晶体学和核磁共振&#xff08;NMR&#xff09;技术&#xff0…