大家好啊!本次版本是2022
年最后一个版本,也是2023
年的第一个版本。该版本主要的目标:
- 采用接口化设计解决了主框架对第三方开源组件
go-redis
耦合的问题,使得主框架更加轻量,对工具化使用框架的场景更加友好。 - 通过开发工具提供升级 主框架、社区组件、开发工具 的命令,提高框架整体易用性,并解决常见的社区组件与主框架版本不一致问题。
- 进一步按照接口与实现分离设计,通过社区组件方式,完善注册发现、配置管理对常用服务的对接,为下一步发布微服务组件做准备。
完整变更列表:https://github.com/gogf/gf/compare/v2.2.0…v2.3.1
新特性
- 将耦合较重的
redis
组件从主框架中解耦,作为社区组件提供。原有主框架增加redis
接口定义,社区组件redis
提供具体的接口实现。因此,请注意,主框架gredis
组件的使用方式发生了一些变更,在依赖redis
的项目中需要引入社区组件redis
实现,否则方法执行将会返回错误。保留兼容原有基础的Do/DoVar
方法,并增加了100+
项常用redis
操作方法:NoSQL Redis - 配置管理及注册发现组件新增常用服务接口实现:
- 新增工具命令
gf up
,用于便捷的框架升级操作,具体介绍请查看:框架升级-up
功能改进
社区组件
配置管理
注册发现
数据库驱动
- 修复
clickhouse
在配置Charset
参数时的报错问题。 - 改进
clickhouse
获取数据表结构结果,返回的Index
顺序统一从0
开始。 - 改进
oracle
表结构获取SQL,以支持float64
数据类型。 - 修复
pgsql
对接口CheckLocalTypeForField
的实现,名称被错误定义为了CheckLocalTypeForValue
,造成生成dao
代码文件时的属性字段类型错误。 - 改进
pgsql
增加对schema
的支持,由于shcema
在大部分数据库服务中代表”数据库名称”,并且也为了兼容旧版本,因此增加Namespace
配置参数用以表示pgsql
的Schema
,而原有的Schema
对象代表pgsql
的catalog
。
NoSQL组件
- 新增
redis
社区组件,实现gredis
相关接口:https://github.com/gogf/gf/tree/master/contrib/nosql/redis
数据库组件
gdb
gredis
- 新增
redis
社区组件,将耦合较重的redis
组件从主框架中解耦,作为社区组件提供。原有主框架增加redis
接口定义,而社区组件redis
提供具体的接口实现。因此,请注意,主框架gredis
组件的使用方式发生了一些变更,在依赖redis
的项目中需要引入社区组件redis
实现,否则方法执行将会返回错误。保留兼容原有的Do/DoVar
方法,并增加了100+
项常用redis
操作方法:NoSQL Redis
- 新增
容器组件
gpool
- 增加
MustPut
方法,在Put
执行出错时直接panic
而不是返回错误对象
- 增加
gqueue
- 改进
Len/Size
方法,解决可能存在的队列计数不准确问题。 - 改进
Len/Size
方法,返回参数类型由int
改为int64
。
- 改进
错误处理
gcode
- 增加
CodeNecessaryPackageNotImport
错误码。
- 增加
gerror
- 改进堆栈打印,统一使用空格替代
\t
,以保证打印格式兼容不同的展示终端。
- 改进堆栈打印,统一使用空格替代
对象管理
gins
- 单例对象增加分组锁机制,提升在高并发下的锁机制性能。
网络组件
ghttp
- 支持在中间件中增加对当前执行路由方法的获取。
- 当路由方法执行的结果不为
200
时,支持在中间件中通过Request.GetError
方法获取内部错误。 - 新增
Response.ServeContent
方法,用于自定义的内容输出接口实现。 - 改进反向代理支持,并增加反向代理示例:https://github.com/gogf/gf/blob/master/example/httpserver/proxy/main.go
- 改进错误日志输出,使用
error
错误级别,便于开发者在自定义日志Handler
中识别日志类型。
goai
- 新增对
security
标签的支持,用以配置OpenAPIv3
安全密钥。 - 改进对带有
json
标签带有,
符号时结构体属性的名称获取。
- 新增对
gtcp
SetSendDeadline
方法名称修改为SetDeadlineSend
。SetReceiveDeadline
方法名称修改为SetDeadlineRecv
。SetReceiveBufferWait
方法名称修改为SetBufferWaitRecv
。
gudp
SetSendDeadline
方法名称修改为SetDeadlineSend
。SetReceiveDeadline
方法名称修改为SetDeadlineRecv
。SetReceiveBufferWait
方法名称修改为SetBufferWaitRecv
。
系统组件
gcache
- 修复
MustGetOrSetFunc
方法逻辑问题。 - 改进
LRU
缓存过期回收机制实现。
- 修复
gcmd
- 改进结构化命令行对象生成,当
brief
标签为空时,自动读取dc
标签内容作为brief
,以保证命令行与接口定义标签习惯相同。
- 改进结构化命令行对象生成,当
gcron
- 改进日志处理,当给定的定时任务方法执行
panic
并且开发者没有设置Logger
接口时,将会使用glog.DefaultLogger
输出错误日志。 - 改进定时触发判断逻辑,解决在底层定时器执行间隔不准确时引起的定时任务触发问题。
- 改进日志处理,当给定的定时任务方法执行
glog
- 改进在滚动切分特性开启时的初始化逻辑,解决在个别场景下的初始化失败导致滚动切分执行失败问题。
- 改进
Clone
方法,进一步浅拷贝提高链式操作性能。 - 新增
LevelPrint
配置,用以控制默认日志Handler
是否打印日志级别字符串。
gres
- 新增
Pack*WithOption
方法,用以提供更细致的资源打包选项控制。 - 标记方法废弃:
Pack/PackToFile/PackToGoFile
。 - 新增
KeepPath
打包选项,用以控制是否在打包文件中保留给定的相对路径,而不是使用带有本地打包目录前缀的路径(相当于去掉了目录前缀)。
- 新增
grpool
- 新增
supervisor
特性,解决在worker
数量较少的场景下,低概率下同时退出的问题。
- 新增
gstructs
- 新增
Tag*
方法,用以获取常见的标签值。
- 新增
gtime
- 改进
Equal/After/Sub
方法,解决在个别场景下的细节问题。 - 改进
EndOf*
方法,返回的时间对象由开发者控制EndOf
计算的粒度。调整默认粒度,由纳秒改为秒粒度进行计算。 - 改进
SetTimeZone
时区设置方法,以实现不同系统下的兼容性,该方法只允许全局设置一次时区,多次调用设置不同时区将会返回错误:时间管理-时区设置
- 改进
文本处理
gstr
- 修复
IsSubDomain
判断主域名为子域名的子域名问题。 - 改进
SubStr/SubStrRune
方法,支持以负数的start
参数指定从右截取字符串。
- 修复
工具组件
gconv
- 新增
Ptr*
方法,用以任意类型到指定类型指针变量的转换。 - 改进
Map*
转换方法对递归转换的处理,默认只会递归转换嵌套的结构体属性。 - 改进
Scan
方法,解决属性同类型以及同类型指针到目标对象/指针的转换问题。
- 新增
gtag
- 将框架中所有的标签名称统一到该模块下通过常量维护。
- 增加
SetOver/SetsOver
方法,用于覆盖设置自定义的标签键值对。
gutil
- 改进
Dump*
方法,支持循环嵌套的对象指针打印。 - 修复
Dump*
方法在部分场景下的反射报错问题。 - 新增
OriginValueAndKind/OriginTypeAndKind
方法,用于获取给定变量的反射值/类型对象,以及在指针变量下对应的原始反射值/类型对象。
- 改进
功能修复
- 修复工具在部分环境下安装失败问题。
- 修复
New*ArrayRange
方法创建数组对象时,在部分场景下数组越界问题。 - 修复
contrib/drivers/clickhouse
在配置Charset
参数时的报错问题。 - 修复
pgsql
数据库生成dao
代码文件时的属性字段类型错误问题。 - 修复数据库ORM组件中
Count
方法的缓存问题。 - 修复
gstr.IsSubDomain
判断主域名为子域名的子域名问题。 - 修复
gutil.Dump*
方法在部分场景下的反射报错问题。
开发工具
- 增加
gf fix
命令,用于低版本升级高版本自动更新本地代码不兼容变更:兼容修复-fix - 增加
gf up
命令,用以将本地的框架低版本升级到最新的框架版本:框架升级-up - 改进
gf build
命令,在构建之前增加环境变量信息打印。 - 改进
gf pack
命令,增加KeepPath
参数,用以控制资源打包后是否保留相对路径:资源打包-pack - 改进
gf gen dao
命令,生成的Transaction
方法中tx
参数从对象指针改为了接口。
兼容提示
Redis
的使用方式发生变更,旧版方法保持兼容,但需要额外添加社区组件的引入(接口与实现分离),具体请查看文档。- 数据库
ORM
的TX
对象从具体实现改为了接口,这块通过开发工具新增的up
或者fix
命令即可自动升级修复。
下一版本目标
- 完善并发布
grpcx
社区组件,实现对grpc
接口协议的扩展支持,并提高微服务开发易用性。 - 官网新增【微服务开发】系列章节,主要以
grpc
开发为主介绍使用goframe
进行微服务开发。 - 主框架去掉对第三方开源组件
gorilla/websocket
的耦合,将WebSocket
的支持接口化,按照框架的通用解耦设计,通过社区组件提供具体实现,提供扩展性和灵活性。