Gone框架介绍26 - Gone v1.x 版本 正式发布,更加强大的依赖注入,更加卓越的执行效率

news2024/12/31 6:58:46

gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/

文章目录

    • 优化和新特性
      • gone 核心功能增强
      • 内置Goners
      • 覆盖测试
    • 后续计划

优化和新特性

gone 核心功能增强

  1. 重构了函数参数依赖注入
    Cemetery上提供了InjectFuncParameters方法,用于完成函数参数的依赖注入。

    该方法的定义如下:

    InjectFuncParameters(
    	fn any,
    	injectBefore func(pt reflect.Type, i int) any,
    	injectAfter func(pt reflect.Type, i int),
    ) (args []reflect.Value, err error)
    
    • 入参说明:
      • fn,需要被注入的函数;函数允许拥有多个入参,入数可以是Gone框架中注册的接口或者结构体指针,也可以为被gone标记了属性的结构体,一般使用匿名结构体;
      • injectBefore,hook函数,在对第i个参数构造前调用,如果injectBefore(x, i)返回值非nil,InjectFuncParameters将不再构造fn函数的第i个参数,而是将该值的reflect.Value直接作为args数组的第i个值;
      • injectAfter,hook函数,在对第i个参数成功构造后调用;
    • 出参说明
      • args,fn参数的reflect.Value数组
      • err,函数构造返回的错误
    • 功能说明:
      根据fn函数的定义和Gone框架中注册的Goners,自动构造fn的参数数组args。然后可以使用func (v Value) Call(in []Value) []Value对函数进行调用。
  2. 引入了gone.GonerOption接口,用于给Bury提供选项。

    • gone.GonerId,在Bury时给Goner提供GonerId
    • gone.Order,在Bury时给Goner提供一个序号;可以用于明确定义Goners的加载顺序和hook函数的执行顺序。
    • gone.IsDefault,在Bury时给Goner提供默认的接口类型,后续我们将另外些一篇博客介绍该特性。
  3. 调整了CemeteryBury*方法支持gone.GonerOption接口,包括:

    • Bury(Goner, ...GonerOption) Cemetery
    • BuryOnce(goner Goner, options ...GonerOption) Cemetery
    • ReplaceBury(goner Goner, options ...GonerOption) error
  4. 重构了gone.Preparer

    • Preparer.RunPreparer.Serve方法,支持传入函数作为参数在框架启动后执行,可以传0个或者多个,函数支持依赖注入;
    • Preparer.BeforeStart, Preparer.AfterStart, Preparer.BeforeStop, Preparer.AfterStop 注册的hook函数,支持依赖注入;
    • 添加Preparer.Test方法,用于编写测试代码。
  5. 基于 gone.Preparer 重构了 TestKit的实现,可以使用下面三种方式之一编写测试代码:

    • gone.Test 测试某种类型的Goner:

        gone.Test(func(line *Line) {
        	assert.Equal(t, line.A.Y, 200)
        }, Priest)
      
    • gone.TestAt,测试某个具名的Goner:

      	gone.TestAt(pointNameA, func(point *Point) {
        	assert.Equal(t, point.X, 0)
        	assert.Equal(t, point.Y, 200)
        }, config.Priest, Priest)
      
    • gone.Prepare().Test,Prepare上的Test方法,支持传入一个函数作为参数,函数的参数将会被自动注入。

        gone.
        	Prepare(Priest).
        	Test(func(
        		line *Line, //注入gone框架中注册的类型
      
        		in struct { //注入匿名结构体
        			point *Point `gone:"example-test-point-a"`
        		},
        	) {
        		assert.Equal(t, line.A.Y, 200)
        		assert.Equal(t, in.point.Y, 200)
        	})
      

内置Goners

  1. 重构goner/gin的HTTP请求参数注入机制。

    • 使用Cemetery.InjectFuncParameters方法,对处理请求时的依赖注入机制进行重构。
    • 在v0.x的版本中,处理HTTP请求注入的方式时,每次请求时都会创建一个函数来处理注入;在v1.x的版本中,会在程序启动流程中一次性构建处理函数,每次处理HTTP请求时的性能损耗和gin的性能差异基本一致。
    • HTTP请求参数的依赖注入,由于使用InjectFuncParameters重构,得到了增强:可以支持多个入参,入参可以是Gone框架中注册的接口或者结构体指针,也可以为被gone标记了属性的结构体,一般使用匿名结构体。
  2. 重构 goner/config,优化代码实现,将接口Configuregoner/config包中提到gone包中。

    • gone.Configure接口用于从抽象的设备中读取配置项,支持实现使用其他方式读取配置,如从文件、数据库等。
    • .properties文件从读取配置,作为默认的配置读取方式,依赖保留在goner/config包中。
  3. 新增加goner/viper,实现了gone.Configure接口,支持从多种配置文件读取配置。

  4. 新增加goner/zap,集成了go.uber.org/zap,用于日志输出。

    • 日志接口Loggerlogrus.Logger包移到gone包中。
    • 使用日志,只需要注入gone.Logger即可;无需关注底层使用的何种日志框架。

覆盖测试

对gone的代码编写了大量的单元测试代码,覆盖率达到90%。
覆盖测试

后续计划

  1. 提供更多的开箱可用的Goners,接入更多的优秀的Web中间件。
  2. 编写一个完善的参考案例

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

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

相关文章

Qt项目天气预报(1) - ui界面搭建

ui中部 效果演示 ui效果 显示效果 控件列表 配合右图查看 居中对齐-label 设置label居中对齐(别傻傻的空格对齐了) 间距配置 widget03 外围的widget对象: 包含label 和 widget0301,如下图 widget0301 内围的widget对象,如下图 样式表 widget03 …

Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理

PreparedStatement SQL注入 执行预编译的SQL对象 这样也能登录成功 模拟 SQL注入是这个原因 现在基本上不存在SQL注入的问题 解决 SQL注入就是传一些语句导致原来的SQL语句改变了 修改代码 通过设置参数的方式 就能防止SQL注入 实际上我们进行了一个转化 将字符和关键字进…

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

🎗️ 主页:小夜时雨 🎗️专栏:动态规划 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…

Python学习打卡:day07

day7 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day753、列表的常用操作课后练习题54、列表的循环遍历列表的遍历—— while 循环列表的遍历—— for 循环while 循环和 for 循环的对比练习 55、元组…

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限…

Kotlin 协程真的轻量吗?

前言 在官方文档的介绍中,提到了: 协程是轻量的 并给出了一个例子: fun main() = runBlocking {repeat(50_000) {// 启动大量的协程launch {delay

模型算法—线性回归

线性回归是统计学中最常见的一种回归分析方法,用于建立自变量(解释变量)和因变量(响应变量)之间的线性关系。线性回归模型可以用来预测一个或多个自变量对应的因变量的值。 线性回归的基本形式如下: &…

【麒麟虚拟机】NetworkManager没有运行

麒麟V10 建linux麒麟虚拟机,发现,网络没有配置 提示,NetworkManager没有运行。编辑联接也不能配置 解决方法,在终端输入命令: sudo systemctl start NetworkManager 启动以后,编辑连接选自动以太网&…

从 Linux 逻辑地址 线性地址 物理地址 内存管理设计,感受Linux kernel 设计的精妙

1,机器解析的思路 发现网络上大量的教程,多是以讹传讹地讲解 Linux 内存管理; 都是在讲: 逻辑地址 -> 线性地址 -> 物理地址 如果谙熟 Linux 制定的GPT和编译原理或对二进制分析比较熟练的话,会发现线性地…

[AIGC] Python的Range函数

Python的range()函数是一个内置函数,常常用于编程中生成数列。这个函数可以生成一个整数序列,这个序列通常用在循环中。 文章目录 基本用法详细用法注意事项 基本用法 range()函数的基本形式为 range(stop) —— 这将生成一个从0开始,到stop…

js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据

要使用正则表达式匹配尖括号()之间的数据,可以使用以下代码示例: 在JavaScript中,你可以使用正则表达式来匹配括号()之间的数据。以下是一个简单的例子,它展示了如何使用正则表达式来获取两对括号之间的文本。 // 示例字符串 con…

5.3.1_2 二叉树的层次遍历

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

17个关键方法指南,保护您的web站点安全!

了解如何让您的web应用程序或网站安全,对于网站所有者来说至关重要。以下是一些关键步骤,可以帮助您保护网站免受攻击和数据泄露。 1.使用公钥加密技术 当数据以明文形式传输时,它容易受到中间人 (MitM) 攻击。这意味…

System-Verilog 实现DE2-115流水灯

文章目录 一、 SystemVerilog1. SystemVerilog简介2. 基本语法和特性 二、实验过程hello.v文件引脚分配 三、实验效果参考 一、 SystemVerilog 1. SystemVerilog简介 SystemVerilog是一种高级的硬件描述语言(HDL),它不仅继承了Verilog语言的…

SpringBoot实现的大文件上传

前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…

vcomp140.dll丢失原因与vcomp140.dll,无法继续执行代码的修复办法详解

vcomp140.dll 是一个动态链接库(Dynamic Link Library,DLL)文件,它在 Windows 操作系统中扮演着关键角色。该文件通常位于系统的标准目录 C:\Windows\System32 下,由微软公司开发并随特定版本的 Windows 或相关软件包一…

kubeadm快速部署K8S

目录 一、kubeadm安装K8S 1.1 环境准备 1.2 初始化配置 1.3 所有节点安装docker 1.3.1 安装依赖环境和docker 1.3.2 定义docker 配置文件 1.3.3 重启并开机自启docker 1.3.4 查看docker 是否配置成功 1.4 master、node01 、node02安装kubeadm,kubelet和kub…

CSS 实现个人资料卡

CSS 实现个人资料卡 效果展示 CSS 知识点 CSS 综合知识运用 页面整体布局 <div class"card"><div class"imgBox"><img src"./bg.jpg" /></div><div class"content"><div class"details&quo…

PCB设计简介

PCB电路板各层的含义 A. Signal And Plane Layers(S) 1. Signal Layers(信号层): 信号层主要用于布置电路板上的导线。Altium Designer提供了32个信号层&#xff0c;包括Top layer(顶层)&#xff0c;Bottom layer(底层)和32个内电层。 包括&#xff1a;Top layer(顶层),Bott…

PAT B1026. 程序运行时间

题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock(&#xff09;函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK——给出了机器时钟每秒所走的时钟打点数…