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

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. 编写一个完善的参考案例

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于HTTP劫持,该如何理解、防范和应对

一、引言 HTTP劫持(HTTP Hijacking)是一种网络安全威胁,它发生在HTTP通信过程中,攻击者试图通过拦截、篡改或监控用户与服务器之间的数据流量,以达到窃取敏感信息或执行恶意操作的目的。今天我们就来详细了解HTTP劫持…

C语言 | Leetcode C语言题解之第160题相交链表

题目: 题解: struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {if (headA NULL || headB NULL) {return NULL;}struct ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA NULL ? headB : pA->ne…

express+vue在线im实现【二】

expressvue在线im实现【一】 在线体验 本期完成了: 1、心跳检测 2、支持发送表情与图片【这个目前还需要优化下,当图片上传后会被默认选中,需要点击一下旁边,使之失去选中效果,才能正常,留待下期优化吧】…

基于Quartus Prime18.1的安装与FPGA的基础仿真教程

Quartus是一种美国科技公司Intel(英特尔)公司开发的FPGA(现场可编辑门阵列)设计编译软件,用作设计、仿真、综合和布局、支持多种编程语言,包括VHDL、Verilog等,并具有丰富的功能和工具库&#x…

17.Meta AI 大模型家族 LLaMA

Meta LLaMA 1 大模型技术解读 LLaMA 1:小模型大数据 LLaMA 1 在万亿 Token 公开数据集上预训练 LLaMA 1 模型网络架构改进 大模型网络架构差异性配置总览 典型大模型网络架构对比 LLaMA 1 预训练超参数配置 典型大模型训练超参数对比 LLaMA 1 预训练效率提升与成本…

net start mysql服务名无效

问题背景 起因是我的电脑因为停电烧坏了系统固态硬盘,再新装系统后,之前的MySQL服务无法通过下面的命令启动。 net start mysql # 报错:服务名无效 报错:服务名无效 报错信息 未找到:在Windows服务中找不到MySQL 找…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调&#xff0…

【APP_汽修宝】数据采集案例APP_数据解密分析

如果不会写代码,那就出书、写博客、做视频、录播客。 📚 S35赛季末王者昭君罗 关键代码定位 使用方法【逆向-快速定位关键代码】通过hook常用函数HashMap方法 动态分析 下面是我们通过访问目标页面时 Frida hook 捕获HashMap的调…

Nginx与Gateway

Nginx与Gateway Nginx 基本介绍 Nginx 是一款轻量级的高性能 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的 Igor Sysoev 所开发,最初供俄罗斯大型的门户网站及搜索引擎 Rambler 使用。 Nginx 的特点在于其占用…

RIP解决不连续子网问题

#交换设备 RIP解决不连续子网问题 一、不连续子网的概念 相同主网下的子网,被另一个主网分割,例如下面实验拓扑在某公司的网络整改项目中,原先R1 和RS 属于同一主网络 10.0.0.0/8,现被 R2、R3、R4 分离,整网采用了 …

从xxl-job源码中学习Netty的使用

1. 启动与Spring实例化 com.xxl.job.core.executor.impl.XxlJobSpringExecutor.java类 继承SmartInitializingSingleton 类,在afterSingletonsInstantiated 实例化后方法中 调用initJobHandlerMethodRepository 把所有的xxljob任务管理起来; private…

.net8系列-图文并茂手把手教你使用Nlog记录.net日志

Nlog是什么? NLog是一个为.NET平台设计的灵活且免费的日志记录库。它适用于包括.NET Framework、.NET Core和.NET Standard在内的多种.NET环境。 Nlog有什么好处或者特点? 配置灵活:NLog允许开发者通过配置文件(通常是NLog.conf…

串口触摸屏分割字符串

分割字符串的方法1、split2、indexOf()3、substr(start,length) 分割字符串的方法 1、split:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 2、indexOf() :返回某个指定的字符串值在字符串中首次出现的位置(从左向右…

机器人、人工智能相关领域 news/events (专栏目录)

Some Insights 一些机器人、人工智能或相关领域的news、events等 1. 智能制造 - 你需要了解的 10 个基本要素 2. 现实世界中的人工智能:工业制造的 4 个成功案例研究 3. 企业使用人工智能情况调查 4. 未来工厂中的人工智能:人工智能加速制造成果规模…

用React编写一个密码组件表单

theme: condensed-night-purple highlight: atelier-cave-light 背景介绍 我们在使用网站或者应用程序的登录界面或创建帐户界面时,往往避免不了需要用户输入密码这一步骤,而用户是否可以选择看见他们输入的密码是十分重要的一项功能。尤其是在当输入的…

QT绘图项目 - 汽车表盘

目录 前言: 整体代码 widget.h widget.cpp 效果演示 实现刻度文字正确排版 优化代码 达到效果 封装整理代码结构: widget.h widget.cpp 指针样式美化 优化后的指针API 效果演示 设置高速刻度为红色 优化刻度API 效果演示 速度显示优化 给内圈画上黑色 优化速度…

【学习-华为HCIA数通网络工程师真题(持续更新)】(2024-6-16更)

1、在 VRP 平台上,可以通过下面哪种方式访向上条历史命令? 上光标 (ctrlU 为自定义快捷键,ctrlP 为显示历史缓存区的前一条命令,左光标为移动光标) 2、主机 A (10.1.1.2/24)和主机 B…

在亚马逊云上部署WordPress:一个完整的LAMP环境安装教程

什么是LAMP LAMP是一个流行的开源软件堆栈,用于网站和网络应用程序的开发和部署。LAMP是几个主要组件的首字母缩写,包括: Linux:操作系统层,LAMP通常部署在Linux操作系统上,但它也可以使用其他类似Unix的…

Golang | Leetcode Golang题解之第155题最小栈

题目: 题解: type MinStack struct {stack []intminStack []int }func Constructor() MinStack {return MinStack{stack: []int{},minStack: []int{math.MaxInt64},} }func (this *MinStack) Push(x int) {this.stack append(this.stack, x)top : thi…

牛客周赛 Round 47 解题报告 | 珂学家

前言 题解 这真的是牛客周赛? 哭了 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的葫芦 签到题 但是写起来有点变扭,方法应该蛮多的 统计分组 有2组一组长度为2,一组长度为3 def check(arr):arr.sort()if arr[0] …