跳到主要内容
版本:2.9.x(Latest)

主要内容

GoFrame v2.9版本带来了多项重要特性和改进,包括ORM分库分表、事务传播&隔离级别控制、OpenAPIv3.1支持、gzip中间件以及全新的Converter类型转换接口等。这些新特性将大幅提升框架的性能、可扩展性和开发体验。

以下为本次版本的主要内容,详细的Change Log请参考: https://github.com/gogf/gf/releases/tag/v2.9.0

完整的代码变更请参考:https://github.com/gogf/gf/compare/v2.8.0...v2.9.0

特别致谢

💖💖💖 感谢所有参与本次版本贡献的开发者们 💖💖💖

GoFrame v2.9 版本贡献者

兼容提示

  1. 框架依赖的最低Go版本从1.20升级到了1.22,以充分利用最新的语言特性、运行时优化和安全增强,显著提升应用性能和稳定性。

  2. net/client

    • 在全局的服务注册发现组件开启时,该组件创建的HTTP Client对象不再默认启用服务发现功能,需要手动开启。
  3. os/glog

    • 日志默认时间打印格式调整为更严谨的2006-01-02T15:04:05.000Z07:00

组件改进

  1. database/gdb

    • 新增ORM分库分表特性,支持水平分表和垂直分库,大幅提升大规模数据处理能力:ORM分库分表
    • 新增ORM事务传播特性,支持类似Spring的事务传播行为,提供更灵活的事务管理:ORM事务处理-事务传播
    • 新增ORM事务隔离级别,支持标准SQL事务隔离级别设置:ORM事务处理-隔离级别
    • 新增ORM事务只读模式,优化只读事务性能:ORM事务处理-只读模式
    • 新增WhereExists/WhereNotExists方法支持,增强子查询能力:ORM查询-Where条件
    • 新增对unix socket数据库链接配置的支持,提供更多连接选项。
    • 修复在OnDuplicate方法中使用gdb.Counter类型失效问题:ORM链式操作-写入保存
    • 修复当用户增加Select Hook并修改返回结构后,部分场景下导致Count/Value/Array查询结构异常问题。
    • 修复在使用with特性时,数据结构中embedded struct的元数据标签中的orm标签失效问题。
    • 修复tinyint(1)/int(1)类型识别为bool类型与旧版本不兼容的问题。
    • 修复database/gdb组件中Order("id", "desc")语句与旧版本不兼容的问题。
    • 优化ORM查询性能和内存使用效率。
  2. net/ghttp

    • 新增常用中间件MiddlewareGzip支持,用于使用gzip算法压缩返回结果,提高传输效率和性能。
    • 新增HandlerItemParsed.GetMetaTag方法,用于通过GetServeHandler获取当前路由执行方法后,通过GetMetaTag方法获取接口定义的元数据信息,增强路由元数据管理能力。
    • 去掉规范路由注册时对api定义时输入输出数据结构的*Req/*Res命名规则限制,支持更灵活的命名方式。
    • 修复接口参数默认值设置在提交空参数(空字符串或0)也生效,造成与文档描述不符的问题。
    • 修复跨域返回Header中自动从Referer生成Origin逻辑不严谨的问题,增强CORS安全性。
    • 修复BuildParams方法构建请求参数时针对json omitempty标签失效问题。
    • 修复Logger设置为nil时会引发的空指针panic问题,提高组件稳定性。
  3. util/gconv

    • 新增Converter转换接口特性,支持更灵活、易扩展的类型转换能力,提供自定义类型转换注册机制:类型转换-Converter
    • 新增自定义类型转换支持,允许开发者注册自定义类型转换函数:类型转换-自定义类型转换
    • 改进Scan方法,增加Scan到基础数据类型的转换支持:类型转换-Scan转换
    • 优化类型转换性能,提高大数据量转换效率。
  4. net/goai

    • 支持最新的OpenAPIv3.1协议规范,与主流API文档工具保持兼容。
    • 新增返回数据结构扩展能力,支持更灵活的响应定义:接口文档-扩展Response
    • 新增自动识别数据校验规则min/max/length/min-length/max-length/betweenOpenAPIv3中对应的校验数据结构,简化文档生成:接口文档-OpenAPIv3
    • 修复参数数据结构中embedded struct数据结构无法扩展为参数结构的问题,提高复杂数据结构支持。
    • 优化文档生成性能和内存占用。
  5. net/client

    • 在全局的服务注册发现组件开启时,该组件创建的HTTP Client对象不再默认启用服务发现功能,需要手动开启:服务注册发现
  6. os/gcache

    • 修复组件中Remove方法返回的数据类型与旧版本不兼容的问题。
  7. errors/gerror

  8. utils/gvalid

    • 修复enums参数使用指针时enums校验失效的问题。
    • 修复参数校验中如果参数是大量的二进制内容[]byte,引发的内存占用过高问题。
  9. os/glog

    • 日志默认时间打印格式调整为更严谨的2006-01-02T15:04:05.000Z07:00
  10. os/gsession

    • 新增RegenerateId/MustRegenerateId方法支持,用以手动重新生成Session ID,防止会话固定攻击:Session-RegenerateId
  11. os/gview

    • 修复个别场景下从资源管理器中读取模板文件失败的问题。
  12. os/gcmd

    • 命令行的参数默认值支持输出到命令帮助界。
  13. net/gipv4

    • 改进ip地址和uint32相互转换实现逻辑。
  14. test/gtest

社区组件

  1. contrib/drivers/pgsql

    • 增加对pgsql数组字段类型varchar[]/text[]的转换支持,自动转换为Go[]string类型。
    • 改进数组类型转换性能。
  2. contrib/config/polaris

    • 新增更多的数据格式内容支持,支持yaml/toml/json/xml/ini/properties等格式。
  3. contrib/registry/consul

  4. contrib/registry/etcd

    • 新增重试机制,解决lease租约过期时的重续问题。
    • 删除默认的AutoSyncInterval配置项,解决个别场景下由该默认配置引发的etcd阻塞问题。
  5. contrib/registry/zookeeper

    • 修复组件中带有额外后缀-的服务名称路径监听错误。
  6. contrib/config/nacos

    • 新增OnChange回调配置支持。
  7. contrib/metric/otelmetric

    • 新增WithExemplarFilter选项支持。

开发工具

  1. 改进gf init命令,初始化项目的模板内容发生了改变,目录结构无变化。
  2. 改进gf up命令,在终端中展示更优雅的cli文件下载界面效果,提升用户体验。
  3. 改进gf gen ctrl命令,api中定义的注释将会自动同步到生成的控制器代码中,减少重复工作。
  4. 改进gf gen dao命令:
    • 新增分表选项参数shardingPattern/sp,用于定义分表规则,生成支持分库的dao代码,配合ORM分库分表特性:数据规范-gen dao
    • 改进代码生成模板,支持Golang Template语法,提供更灵活的代码生成能力。
    • 优化生成代码的质量和可读性。
  5. 改进gf gen enums命令:
    • 修改默认读取的接口数据结构定义目录为api,更符合项目规范。
    • 修改默认生成代码文件路径为internal/packed/packed_enums.go,优化代码组织。
  6. 改进gf gen genpbentity命令:
    • 增加TypeMappingFieldMapping特性支持,提供更灵活的类型映射:数据表PB-gen pbentity
    • 增加TablesEx支持,用于生成proto文件时可以忽略指定的表,提高灵活性。
    • 增加GoPackage选项用于指定生成proto文件中的go_package配置项,更好地支持模块化。
  7. 修复gf build命令在打印环境变量时不准确的问题,应当打印修改环境变量后,在编译文件时,真实使用的环境变量。
  8. 修复gf gen pb命令在部分场景下使用-a选项时,多次执行命令后,自定义标签重复添加的问题。
  9. 修复cmd/gf组件中make命令在项目模板中生成的Makefile文件中的命令不正确的问题。
  10. 整体提升命令行工具的稳定性和用户体验。
Ask me