大家好呀!自上次发布到现在,从初秋到深冬,我们也完全冇闲着哟,我们这次带来了爱心满满的 GoFrame v1.15 版本。此外,还有两件事:

经过多年的潜心修炼和稳定发展, GoFrame 已经逐步成长为了一款企业级的 Golang 基础开发框架,她提供了项目开发规范、开发工具链、完善的基础模块、丰富的开发文档、高代码质量以及活跃的社区。为保证框架质量,我们为各个组件进行了大量的单元测试以保证逻辑的正确( 2534 例测试单元, 9097 项测试断言),同时维护了高质量的文档,至今,已有很多的大型/中小型互联网公司在生产环境使用 GoFrame

开源不易,有你们的理解和支持,幸福满满!感谢所有参与项目开发的小伙伴们,爱你们! GoFrame, YES!

GoFrame

GF(Go Frame) 是一款模块化、高性能、企业级的 Go 基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、配置管理、资源管理、数据校验、定时任务、数据库 ORMTCP/UDP 组件、进程管理/通信等等。并提供了 Web 服务开发的系列核心组件,如: RouterCookieSessionMiddleware、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、 TLS/HTTPSRewrite 等特性。

如果您初识 Go 语言,您可以将 GoFrame 类似于 PHP 中的 Laravel, Java 中的 SpringBoot 或者 Python 中的 Django

v1.15 2020-12-31 - 图1

特点

  • 模块化、松耦合设计;
  • 模块丰富、开箱即用;
  • 简便易用、易于维护;
  • 高代码质量、高单元测试覆盖率;
  • 社区活跃,大牛谦逊低调脾气好;
  • 详尽的开发文档及示例;
  • 完善的本地中文化支持;
  • 设计为团队及企业使用;

Change Logs

  1. ghttp
    • 改进 HTTPClientGET 请求相关方法,当传递参数时不再作为 Body 参数提交,而是自动构造为 QueryString 提交。以保证与其他服务端的兼容能力。
    • 请求对象 Request 增加默认值设置特性: 请求输入-默认值绑定
    • 增加 Request.SetCtx 方法,用于自定义上下文变量,常用于中间件/拦截器中: 请求输入-Context
    • 模板解析中增加 Request 变量,用于获得客户端提交的请求参数,无论是 QueryString/Form 类型参数: 数据返回-模板解析
    • Cookie 功能改进,如何设置与 Session 有效期保持一致的 Cookie,请参考: Cookie#Cookie会话过期
    • 分组路由注册增加 ALLMap 方法,用于批量注册路由: 分组路由#批量注册
    • 新增 CRSF 插件介绍文档: CSRF防御设置
    • 其他一些功能及细节改进。
  2. gdb
  3. gerror
    1. 增加 Newf/NewSkipf 方法创建错误对象: 错误处理
    2. 增加对错误码特性的支持: 错误处理-错误码使用
    3. 完善单元测试。
  4. gvalid
    • 增加 phone-loose 宽松手机号校验规则,只要满足 13/14/15/16/17/18/19 开头的 11 位数字都可以通过验证。
    • 返回校验错误实现了 gerrorCurrent() error 接口,因此可以使用 gerror.Current 方法来获取当前第一条校验错误: 数据校验-校验结果
    • 其他细节改进。
    • 单元测试完善。
  5. gvar
    • 增加 IsNil/IsEmpty 方法,判断数据是否为 nil/空
    • 增加 IsInt/IsUint/IsFloat/IsSlice/IsMap/IsStruct 常用类型判断方法。
    • 标注废弃 StructDeep/StructDeep 方法,直接使用 Struct/Structs 即可。
    • 完善单元测试。
  6. ghtml
    • 增加 SpecialCharsMapOrStruct 方法,用于自动转换 map/struct 键值/属性中的 HTML 代码,防止 XSS
  7. gjson
    • 标记废弃 To* 转换方法,例如: ToStruct 替换为 Struct 方法。
    • 一些细节问题改进。
    • 单元测试完善。
  8. internal
    • 改进并完善 internal/empty 包的空值判断。
    • 由于性能问题 https://github.com/gogf/gf/issues/1004 ,临时删除了 internal/json 包中对第三方包 github.com/json-iterator/go 的依赖,还原为标准库 encoding/json
    • 改进 internal/structs 包,由于该包在 struct 转换特性中使用比较频繁,因此去掉第三方包 github.com/gqcn/structs 的依赖,简化了反射处理逻辑,提高了性能以及易用性,提高了长期维护性。
    • internal/utils 包增加 RemoveSymbols 方法,用于删除字符串中的特殊字母。改进 EqualFoldWithoutChars 方法,去掉对字符串中字符串的正则过滤功能,极大提高了方法性能。不要小看这两个小函数,性能的点滴改进能提高框架中其他涉及到复杂类型转换模块的性能。 internal 包虽然不直接对外暴露方法,但是却影响着框架中的一些核心组件性能。
  9. gcfg
  10. gcmd
    • 改进默认参数解析获取方式: 命令管理-gcmd
    • 增加 GetWithEnv 方法,当命令行中不存在指定参数时,同时从环境变量中获取: 命令管理-gcmd
  11. genv
    • 增加 SetMap 方法,用于批量设置环境变量。
    • 增加 GetWithCmd 方法,当环境变量中不存在指定参数时,同时从命令行参数中获取: 环境变量-genv
  12. gfile
    • 标记废弃 ReadByteLines 方法,新增 ReadLinesBytes 方法。
    • 调整 ReadLines/ReadLinesBytes 方法回调函数定义,增加 error 返回。
  13. glog
    • 改进滚动更新功能。
    • 其他一些细节改进。
  14. gsession
    • 增加 SetMap 方法,用于批量设置键值对数据。
  15. gtimer
    • 常量名称改进,统一采用大驼峰方式。
  16. gview
    • 增加内置模板函数 map,用于将参数转换为 map[string]interface{} 类型。
    • 增加内置模板函数 maps,用于将参数转换为 []map[string]interface{} 类型。
    • 增加内置模板函数 json,用于将参数转换为 JSON 字符串类型。
    • 文档更新: 模板函数-内置函数
    • 其他一些细节改进。
  17. gconv
    • 性能改进。
    • 功能改进(细节改进有点多,实在不想写得太详细)。
    • 代码更加健壮。
    • 单元测试完善。
  18. gutil
    • 增加 Keys 方法,用于获取 map/struct 的键名/属性名称,构造成数组返回。
    • 增加 Values 方法,用于获取 map/struct 的键值/属性值,构造成数组返回。
    • 增加 MapToSlice 方法,例如: {"K1": "v1", "K2": "v2"} => ["K1", "v1", "K2", "v2"]
    • 增加 StructToSlice 方法,例如: {"K1": "v1", "K2": "v2"} => ["K1", "v1", "K2", "v2"]
    • 增加 SliceToMap 方法,例如: ["K1", "v1", "K2", "v2"] => {"K1": "v1", "K2": "v2"}
    • 单元测试完善。
    • 其他细节改进。

Bug Fix

  1. 修复 garray/gmap/gtreeClone 方法并发安全判断问题。
  2. 修复当设置了过期方法,但 gpool 在元素项过期时没有自动调用过期方法处理的问题。
  3. 修复 gfile.ReadLInes/ReadLineBytes 在数据量大时的读取重复问题。
  4. 其他一些错误修复。