大家好啊!万众瞩目的 GoFrame v2 版本终于发布了正式版本!本次版本包含了大量改进以及新特性,同时新增了一些开创性的功能特性。

去年夏天到今年春天,一路以来的努力,希望大家满意。

感谢所有社区小伙伴的贡献,感谢社区朋友们的支持!

新的一年,我们继续,脚踏实地,不忘初心!

升级指导: 如何从v1愉快升级到v2

一、重要特性

1、新版工程设计

  • 更加严谨规范
  • 命名风格的规范
  • 指针与值传递参数的规范
  • 进一步简便、提高开发效率
  • 新版开发工具支持工程规范准确落地
  • Entity/DAO/DO 特性
  • 面向接口化设计
  • 更多详细介绍: 工程开发设计(🔥重点🔥)

2、全链路跟踪特性

  • 可观测性更进一步:大胆的前瞻以及决心
  • 框架默认启用 OpenTelemetry 特性
  • 框架默认创建 TraceID,按照 OpenTelemetry 生成标准
  • 框架核心组件均支持链路跟踪信息传递
  • 日志组件支持链路信息打印
  • 更多详细介绍: 全链路跟踪设计

3、规范路由注册特性

  • 规范化API按照结构化编程设计
  • 规范化API接口方法参数风格定义
  • 更加简化的路由注册与维护
  • 统一接口返回数据格式设计
  • 自动的API参数对象化接收与校验
  • 自动生成基于标准 OpenAPIv3 协议的接口文档
  • 自动生成 SwaggerUI 页面
  • 更多详细介绍: 路由注册-规范路由

4、全错误堆栈特性

  • 框架层面所做的重大决定
  • 框架 所有 组件错误均支持错误堆栈
  • 详细介绍: 全错误堆栈设计

5、全新错误码特性

  • 采用接口化设计,扩展性高
  • 提供可供选择的常见错误码
  • 框架核心组价底层已增加错误码支持,例如根据 error 中的错误码可以识别是否 DB 执行错误
  • 更多详细介绍: 错误处理-错误码特性

6、组件接口化设计

  • 自顶向下统一化的接口化设计
  • 核心组件均采用接口化设计
  • 更高的扩展性、可定制性
  • 更多详细介绍: 接口化与泛型设计

7、框架泛型的支持

  • 什么是框架 gvar 泛型?
  • 框架 gvar 泛型在框架核心组件中的大量使用
  • 框架 gvar 泛型的重要价值
  • 为什么不建议在顶层业务中使用泛型
  • 更多详细介绍: 接口化与泛型设计

8、ORM的大量改进

9、其他重要改进

1)日志组件 Handler 特性

  • 采用中间件设计
  • 支持多个 Handler 处理
  • 为开发者自定义日志处理提供了更灵活强大的支持
  • 更多详细介绍: 日志组件-Handler

2)日志组件颜色打印

  • 在终端中默认输出颜色打印
  • 默认不同级别不同的颜色,可配置
  • 输出到文件/自定义 Writer 默认关闭,可通过相关配置开启
  • 更多详细介绍: 日志组件-颜色打印

4)调试模式介绍完善

二、功能改进

1、数据组件

  1. /database/gdb

  2. 废弃 Table 方法,统一使用 Model 方法创建 Model 对象。

  3. 废弃 Model 中的 Struct/Structs 方法,统一使用 Scan 方法执行查询结果到 Struct 对象/对象数组映射转换: ORM查询-Scan

  4. 废弃 BatchInsert/BatchReplace/BatchSave 方法,统一使用 Insert/Replace/Save 方法实现,内部自动实现参数类型识别采用单条写入还是批量写入: ORM链式操作-写入保存

  5. 增加 DoFilter 接口方法,用于 ORM 提交执行 SQL&Args 到底层 driver 之前的 SQL&Args 自定义过滤: ORM接口开发-回调处理

  6. 增加 DoCommit 接口方法,用于 ORM 提交执行 SQL&Args 到底层 driver 之前的自定义处理

  7. 增加 ConvertDataForRecord 接口方法,用于自定义的数据转换处理。 ORM接口开发-回调处理

  8. 增加 Raw 方法,用于通过原始 SQL 语句构建 Model 对象,随后可以使用 Model 的链式操作以及各种特性: ORM链式操作-模型创建

  9. 增加 Handler 特性,用于自定义的 Model 对象修改,并返回新的 Model 对象,可轻松地复用常见的逻辑: ORM链式操作-Handler特性

  10. 增加 Union/UnionAll 特性,用于多条 SQL/Model 的查询结果合并: ORM查询-Union/UnionAll

  11. 增加 With 特性对条件查询以及排序语句的配置支持: 模型关联-静态关联-With特性

  12. 增加 OnDuplicate/OnDuplicateEx 方法,用于指定 Save 方法的更新/不更新字段: ORM链式操作-写入保存

  13. 增加 Wheref/WhereOrf 方法,用于带有格式化字符串语句的条件传递: ORM查询-Where条件

  14. 增加 WhereLT/WhereLTE/WhereGT/WhereGTE 以及 WhereOrLT/WhereOrLTE/WhereOrGT/WhereOrGTE 方法,用以为ORM添加常见的比较条件:https://

  15. 增加 WherePrefix/WhereOrPrefix 方法,用以在为条件字段加上表前缀,常用于关联查询中

  16. 增加 FieldsPrefix/FieldsExPrefix 方法,用于为查询的字段增加自定义的表前缀,常用于关联查询中

  17. 增加 FieldsCount/FieldsSum/FieldsMin/FieldsMax/FieldsAvg 方法,用于增加常见的统一查询条件

  18. 增加 LeftJoinOnField/RightJoinOnField/InnerJoinOnField 方法,用于便捷关联带有相同字段名称的表

  19. 增加 OmitEmptyWhere/OmitEmptyData 方法,用于特定过滤 Where 条件和 Data 数据中的空值数据: ORM链式操作-字段过滤

  20. 增加 OmitNil/OmitNilWhere/OmitNilData 方法,用于特定过滤 Where 条件和 Data 数据中的 nil 数据: ORM链式操作-字段过滤

  21. 增加 TimeZone 配置项,用于数据库查询的自定义时区转换(目前支持 mysql/pgsql): ORM使用配置

  22. 改进 Cache 缓存特性,支持增加准确的缓存参数控制

  23. 增加 Close 方法,用于手动关闭数据库连接

  24. 去掉 ORM 在使用没有自定义配置时默认 100 连接数的配置限制。

  25. 改进时间维护特性,不再自动过滤开发者提交的 CreatedAt/UpdatedAt/DeletedAt 相关参数,意味着开发者可以在 ORM 操作中自定义相关时间字段的更新。

  26. 改进数据库执行的SQL日志记录,增加影响行数记录

  27. 接口方法 HandleSqlBeforeCommit 名称修改为了 DoCommit

  28. 数据库方法操作统一增加 context.Context 作为第一必须参数。

  29. 修复 gdb 组件的 With 特性多层级查询失效问题。

  30. 删除查询结果类型 Record/Result 的所有已废弃的方法。

  31. 单元测试完善。

  32. /database/gredis

  33. 采用适配器模式,以接口化设计重构该组件,以提高扩展性: Redis-接口化设计

  34. 默认提供基于第三方 goredis 包的适配器实现,增加了对 Redis 集群的支持: Redis-配置管理

  35. 由于集群特性的支持,配置文件格式发生改变: Redis-配置管理

2、网络组件

  1. /net/ghttp
  2. 新增路由注册方式: 路由注册-规范路由
  3. 默认将 Request 对象注入到 ctx 上下文对象中,并增加 RequestFromCtx/g.RequestFromCtx 方法获取 ctx 中的 Request 对象。
  4. Client 功能特性进行抽离,封装为 gclient 组件: HTTPClient
  5. Server 日志增加对 ctx 上下文链路信息打印的支持,并改进日志格式: 链路跟踪
  6. 参数获取返回统一使用 *gvar.Var 泛型对象。
  7. 废弃 ghttp 中相关的 HTTP Client 直接操作方法,必须通过创建 Client 对象来实现客户端访问操作。
  8. 废弃 Controller 路由注册方式,并删除相关实现逻辑代码。
  9. /net/gtrace
  10. 升级 go.opentelemetry.io/otel 到最新的正式版。
  11. 完善全新的链路跟踪使用文档: 服务链路跟踪

3、系统组件

  1. /os/glog
    1. 为推进可观测性特性,落实链路跟踪规范,所有日志打印方法均增加 context.Context 参数。
    2. 日志组件增加了 Handler 特性,采用中间件设计、支持多个 Handler 处理,为开发者自定义日志处理提供了更灵活强大的支持: 日志组件-Handler
    3. 日志组件增加了对内容的颜色打印特性支持,在终端中默认输出颜色打印,输出到文件/自定义 Writer 默认关闭、可通过相关配置开启: 日志组件-颜色打印
    4. 废弃 Println 方法。
    5. 文档更新: 日志组件
  2. /os/gres
    1. 新增 Export 方法用于将资源组件中的文件导出到本地磁盘: 资源管理-方法介绍
  3. /os/gfile
    1. 新增 SizeFormat 方法用于获取指定文件格式化后的大小字符串。
    2. 文档更新: 文件管理-gfile
  4. /os/gcache
    1. 采用适配器模式,以接口化设计重构该组件,以提高扩展性: 缓存管理-接口设计
    2. 默认提供了基于进程内存的缓存实现: 缓存管理-内存缓存
    3. 所有操作方法增加了 context.Context 上下文参数。
    4. 参数获取返回统一使用 *gvar.Var 泛型对象。
    5. 增加 Must* 方法,用以直接获取参数并在产生错误时直接 panic
  5. /os/gcfg
    1. 采用适配器模式,以接口化设计重构该组件,以提高扩展性: 配置管理-接口化设计
    2. 默认提供了基于文件系统的配置管理实现: 配置管理
    3. 参数获取返回统一使用 *gvar.Var 泛型对象。
    4. 所有操作方法增加了 context.Context 上下文参数。
    5. 增加 GetWithEnv 方法,当配置适配器中无法查找到对应的参数时,将会自动读取环境变量中的相应参数: 配置管理-配置读取
    6. 增加 GetWithCmd 方法,当配置适配器中无法查找到对应的参数时,将会自动读取命令行参数中的相应参数: 配置管理-配置读取
    7. 增加 Must* 方法,用以直接获取参数并在产生错误时直接 panic
    8. 配置组件易用性改进,通过单例对象访问配置组件将会按照 toml/yaml/yml/json/ini/xml 文件后缀自动检索配置文件: 配置管理
  6. /os/gcmd
    1. 参数获取返回统一使用 *gvar.Var 泛型对象。
    2. 全新的多层级命令行管理方式,支持自动生成命令行使用提示: 命令管理-命令行对象
    3. 增加基于对象的命令行管理方式,更适合大量的终端命令场景: 命令管理-结构化参数
  7. /os/genv
    1. 参数获取返回统一使用 *gvar.Var 泛型对象。
  8. /os/gcron
    1. 定时任务方法定义增加 context.Context 参数。
    2. 所有创建定时任务方法增加 context.Context 参数。
    3. 文档更新: 定时任务-gcron
  9. /os/gtime
    1. 废弃 Second/Millisecond/Microsecond/Nanosecond 包方法,使用 Timestamp/TimestampMilli/TimestampMicro/TimestampNano 方法替代。
    2. 文档更新: 时间管理-gtime
  10. /os/gtimer
    1. 定时器方法定义增加 context.Context 参数。
    2. 所有创建定时器方法增加 context.Context 参数。
    3. 改进基于优先级队列数据结构存储的定时任务执行检测机制,提高执行性能。
    4. 文档更新: 定时器-gtimer
  11. /os/grpool
    1. 回调方法定义增加 context.Context 参数。
    2. goroutine 池任务添加方法增加 context.Context 参数。
    3. 文档更新: 协程管理-grpool
  12. /os/gsession
    1. gsession.Storage 接口增加 ctx 上下文参数输输入,用于承接上下文信息、实现完整的链路跟踪。并未保证严谨性增加 error 返回参数: Session
    2. 参数获取返回统一使用 *gvar.Var 泛型对象。
  13. /os/gview
    1. 模板解析方法统一增加 context.Context 参数。
    2. 增加 plus/minus/times/divide 四则运算内置模板方法。
    3. 文档更新: 模板引擎
  14. /os/gstructs
    1. 将框架 internal 中的 structs 包开放,命名为 gstructs,用于 struct 反射操作的高级使用包: 对象信息-gstructs

4、错误处理

  1. /errors/gerror

  2. 增加 Message 方法,用于获取指定错误码的错误信息。

  3. 增加 CodeMessage 方法,用于获取指定错误的错误码信息。

  4. 增加 NewOption 方法,用于自定义配置的错误对象创建,献给框架高级玩家。

  5. 增加 HasStack 方法,用于判断给定的error接口对象是否实现(包含)了堆栈信息。

  6. 错误码从整型改为接口对象,以实现可定制性并提高可扩展性,详情参考 gcode 组件介绍: 错误处理-错误码特性

  7. 提高易用性,改进 NewCode/NewCodeSkip/WrapCode/WrapCodeSkip 方法,调增 text 输入参数为非必须,默认使用对应错误码的 Message 信息。

  8. /errors/gcode

  9. 增加 gcode 错误码组件,提供可定制型和扩展性极强的错误码管理,结合 gerror 组件实现强大的错误处理: 错误处理-错误码使用

5、其他组件

  1. /container/garray
  2. 各数组类型统一增加 At 方法,用于直接获取返回索引位置的数据。
  3. 文档更新: 数组类型-方法介绍
  4. /debug/gdebug
  5. 增加 TestDataContent 方法,用于直接获取测试包下 testdata 目录下指定路径文件内容。
  6. 文档更新: 调试功能-gdebug
  7. /encoding/gjson
  8. 废弃大部分的 Get* 方法,统一使用 Get 方法获取指定 pattern 的内容,并统一返回 *gvar.Var 泛型对象,开发者根据业务场景自行通过对应方法便捷转换为特定类型变量。
  9. 增加若干 Must* 方法。
  10. 使用文档全面更新
  11. /frame/g
  12. 增加 ModelRaw 方法,用于便捷创建基于原生 SQL 的数据库 Model 对象。
  13. 为通过 /frame/g 模块创建的 ORM 对象增加 logger 配置,通过自动读取配置文件,自动初始化: ORM使用配置
  14. 为通过 /frame/g 模块创建的 Server 对象增加 logger 配置,通过自动读取配置文件,自动初始化: 服务配置
  15. /frame/gmvc
  16. 标记废除 gmvc 耦合模块,未来不再进一步支持。
  17. /util/gutil
  18. 改进实现 Dump 方法,不再使用 json 包实现类型打印,而是自实现了对任意类型的打印特性,并且支持打印详细的数据类型: 工具方法-gutil
  19. 增加 SliceToMapWithColumnAsKey 方法,用以将 Slice 按照一定规则转换为 Map
  20. /utils/gvalid
  21. 增加 bail 校验规则,以及 Bail 链式操作方法,用以在数据校验不通过时直接退出校验,不再执行后续校验规则。
  22. 增加 datetime 校验规则,用以校验常用日期时间类型,其中日期之间支持的连接符号只支持 -,格式如: 2006-01-02 12:00:00
  23. 去掉包校验方法,统一使用链式操作实现数据校验。
  24. 所以校验方法增加 context.Context 参数。
  25. 全新、超完善的数据校验组件使用文档: 数据校验

其他大量的改进细节,这里不再赘述,感兴趣的小伙伴可参阅官网 goframe.org

三、CLI工具链

  1. 采用全新 gcmd 命令行对象封装重构实现。
  2. 改进 init 命令,支持 SingleRepo/MonoRepo 两种仓库初始化。并且项目初始化不再依赖远端仓库。
  3. 改进 gen dao 命令,采用全新的 V2 工程化设计,自动生成 entity/dao/do 代码文件。
  4. 去掉 update 命令,工具的更新统一走 https://github.com/gogf/gf/tree/master/cmd/gf
  5. 去掉 get 命令。
  6. 全新文档: 开发工具