gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/
文章目录
- 优化和新特性
 - gone 核心功能增强
 - 内置Goners
 - 覆盖测试
 
- 后续计划
 
优化和新特性
gone 核心功能增强
-  
重构了函数参数依赖注入
在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个参数成功构造后调用;
 
 - fn,需要被注入的函数;函数允许拥有多个入参,入数可以是Gone框架中注册的接口或者结构体指针,也可以为被
 - 出参说明 
    
- args,fn参数的
reflect.Value数组 - err,函数构造返回的错误
 
 - args,fn参数的
 - 功能说明:
根据fn函数的定义和Gone框架中注册的Goners,自动构造fn的参数数组args。然后可以使用func (v Value) Call(in []Value) []Value对函数进行调用。 
 - 入参说明: 
    
 -  
引入了gone.GonerOption接口,用于给
Bury提供选项。- gone.GonerId,在Bury时给Goner提供GonerId
 - gone.Order,在Bury时给Goner提供一个序号;可以用于明确定义Goners的加载顺序和hook函数的执行顺序。
 - gone.IsDefault,在Bury时给Goner提供默认的接口类型,后续我们将另外些一篇博客介绍该特性。
 
 -  
调整了Cemetery上
Bury*方法支持gone.GonerOption接口,包括:Bury(Goner, ...GonerOption) Cemetery,BuryOnce(goner Goner, options ...GonerOption) CemeteryReplaceBury(goner Goner, options ...GonerOption) error
 -  
重构了gone.Preparer
Preparer.Run和Preparer.Serve方法,支持传入函数作为参数在框架启动后执行,可以传0个或者多个,函数支持依赖注入;Preparer.BeforeStart,Preparer.AfterStart,Preparer.BeforeStop,Preparer.AfterStop注册的hook函数,支持依赖注入;- 添加
Preparer.Test方法,用于编写测试代码。 
 -  
基于 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
-  
重构
goner/gin的HTTP请求参数注入机制。- 使用
Cemetery.InjectFuncParameters方法,对处理请求时的依赖注入机制进行重构。 - 在v0.x的版本中,处理HTTP请求注入的方式时,每次请求时都会创建一个函数来处理注入;在v1.x的版本中,会在程序启动流程中一次性构建处理函数,每次处理HTTP请求时的性能损耗和gin的性能差异基本一致。
 - HTTP请求参数的依赖注入,由于使用InjectFuncParameters重构,得到了增强:可以支持多个入参,入参可以是Gone框架中注册的接口或者结构体指针,也可以为被
gone标记了属性的结构体,一般使用匿名结构体。 
 - 使用
 -  
重构
goner/config,优化代码实现,将接口Configure从goner/config包中提到gone包中。gone.Configure接口用于从抽象的设备中读取配置项,支持实现使用其他方式读取配置,如从文件、数据库等。- 从
.properties文件从读取配置,作为默认的配置读取方式,依赖保留在goner/config包中。 
 -  
新增加
goner/viper,实现了gone.Configure接口,支持从多种配置文件读取配置。 -  
新增加
goner/zap,集成了go.uber.org/zap,用于日志输出。- 日志接口
Logger从logrus.Logger包移到gone包中。 - 使用日志,只需要注入
gone.Logger即可;无需关注底层使用的何种日志框架。 
 - 日志接口
 
覆盖测试
对gone的代码编写了大量的单元测试代码,覆盖率达到90%。
 
后续计划
- 提供更多的开箱可用的Goners,接入更多的优秀的Web中间件。
 - 编写一个完善的参考案例
 









![[AIGC] Python的Range函数](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fwww.bing.com%2Fimages%2Fsearch%3Fq%3DPython%2Brange%2Bfunction&pos_id=img-n7g2PIoJ-1718526163083)
![js 用正则表达式 匹配自定义字符之间的字符串数据,如:( )、[ ]、{ }、< >、【】等括号之间的字符串数据](https://img-blog.csdnimg.cn/direct/4450994bc8224c729223c8fc3a666100.png)








