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

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

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

相关文章

【区分】累次极限与二重极限

累次极限与二重极限不要混淆,区分好下面5个命题

Java Character类:功能、应用与最佳实践

Java中的Character类是一种用于处理字符数据的包装类,属于java.lang包。作为基础类型char的包装类,Character提供了一系列静态方法来操作和检索字符的各种特性。这包括字符的类别判断(如字母、数字、空白等)、大小写转换、字符比较…

Python学习笔记13 -- API的说明及使用

一、API说明 1、API:Application Programming Interface -- 接口 2、Restful API:基于网页的API 3、JSON:JavaScript objection Notation 4、很多数据都可以找到公用API 二、安装requests模块 在终端输入: 可以保证使用当前…

os.system() 函数

os.system() 是 Python 标准库 os 模块中的一个函数,用于在子终端中运行系统命令。它可以在 Python 脚本中调用外部命令或程序。具体来说,它通过执行命令字符串并返回执行状态来实现这一点。下面是对 os.system() 函数的详细解释: import os…

第66集《摄大乘论》

请大家打开《讲义》第二二二页: 庚九、念(分二:辛一正念法身;辛二兼显净土) 辛一、正念法身(分二:壬一征;壬二释) 壬一、征 这个是讲到十门分别(二0三页),分别清净法身的第九段,讲到念&…

单片机多个中断源时的设计思路,(51为例)工作寄存器R0-R7

51单片机中四组工作寄存器(R0-R7) 参考 可以看出每个工作寄存器区有8个字节即为R0-R7,当不指定使用哪个工作寄存器区的时候默认0区。其他工作区作为普通的RAM使用。特殊功能寄存器中有可以位寻址和不能位寻址的区域 下面文字引用 通过修改…

常用静止轨道卫星(geostationary satellite)及相关产品

1. 数据简介 维基百科 link 地球静止轨道(或称地球赤道同步轨道,英语:geostationary orbit,简写:GEO)是指地球赤道面上方35,786km的圆形轨道,该轨道上航天器的运行方向和地球自转方向一致。在…

使用python绘制三维散点图

使用python绘制三维散点图 三维散点图三维散点图的用途效果代码 三维散点图 三维散点图(3D Scatter Plot)是一种用于展示三维数据的图表。与二维散点图类似,三维散点图通过点在三维空间中的位置来表示数据点的三个特征。每个点在 x、y 和 z …

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践--图文解析

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践–图文解析 原文链接:https://juejin.cn/post/7358704806779437097 原文作者:转转技术团队 业财系统:业务和财务一体化系统 与传统财务记账不同,一笔金额不再是…

【Python网络爬虫分步走】使用LXML解析网页数据

Python网络爬虫分步走 – 使用LXML解析网页数据 Web Scraping in Python - Using LXML to Parse Web Data By Jackson@ML Lxml作为Python的第三方库,提供易用的且功能强大的API,用来解析XML和HTML文档。事件驱动的API被用于分步骤解析。 本文简要介绍使用lxml库解析网页的基…

机器学习中的神经网络重难点!纯干货(上篇)

. . . . . . . . .纯干货 . . . . . . 目录 前馈神经网络 基本原理 公式解释 一个示例 卷积神经网络 基本原理 公式解释 一个示例 循环神经网络 基本原理 公式解释 一个案例 长短时记忆网络 基本原理 公式解释 一个示例 自注意力模型 基本原理…

一些前端优质的代码片段

在前端编程中,高质量的代码不仅实现功能,还注重可读性、可维护性和性能。以下是一些值得品味和学习的优质前端代码片段,涵盖了函数式编程、ES6新特性、以及一些最佳实践示例: 文章目录 1. 箭头函数与数组方法结合使用2. 解构赋值…

Digital电路仿真软件的安装

文章目录 1. Java环境的安装 2. Digital安装 3. 软件配置 1. Java环境的安装 电路仿真软件Digital是一款用于设计和仿真数字逻辑电路的工具。它可以帮助用户创建、测试和调试各种数字电路,提供可视化的电路编辑环境,使得设计过程更加直观和便捷。 D…

MySQL数据操作与查询- 连接查询

一、引入 1、为什么需要使用连接查询? 查询信息的来源如果来自多张表,则必须对这些表进行连接查询。 2、连接查询的分类 内连接和外连接。 二、内连接 1、概述 将两张表的记录组合在一起,产生一个新的结果。 (1&#xff09…

【Java】过滤器/拦截器

文章目录 两者区别request链路全过程 在实际开发中,过滤器和拦截器都是经常使用的技术,但一被提及到其区别时,整个人就愣住了,好像没有认真地对两者进行区别和总结,这两者之间也确实很容易混淆,因此结合了很…

Milvus Cloud 问答机器人 上线!构建企业级的 Chatbot

01. 背景 早些时候我们在社区微信群发出了一份关于Milvus Cloud 自动问答机器人的调研问卷。 调研受到了社区同学的积极响应,很快我们就收到了很多热心用户的回复。 基于这些回复,我们整理出了 Milvus Cloud Chatbot 的形态: 以功能使用和文档查询为核心 提供聊天和搜索双形…

version-manager最好用的SDK版本管理器,v0.6.2发布

项目地址:https://github.com/gvcgo/version-manager 中文文档:https://gvcgo.github.io/vdocs/#/zh-cn/introduction 功能特点: 跨平台,支持Windows,Linux,MacOS支持多种语言和工具,省心受到…

react捡起来了

通过脚手架创建react项目: 1.首先看下自己的npm和node版本:cmd打开自己的终端:输入: npm -v 查看npm的版本 node -v查看node的版本 2.不确定自己以前是否安装过creare-react-app,可以通过create-react-app -V(–versio…

【Apache Doris】周FAQ集锦:第 5 期

【Apache Doris】周FAQ集锦:第 5 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…

【泛微系统】PC端/移动端JS写法区别

PC端/移动端JS写法区别 1.提交时调用的方法不同: PC端提交时调用:checkCustomize 移动端提交时调用:window.doSubmit_4Mobile 案例:PC端:var checkCustomize2 = checkCustomize;checkCustomize = function (){//这里添加代码//if(1 == 2){// return false;//}return …