GoFrame

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

特点

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

发展

GoFrame 开始得比较早, 2011 年始于北京一个智能物联网平台项目,那时还没有这么多物联网的现行标准, Go 的标准库以及生态也未如此丰富。 2017 年的时候 GoFrame 才开始发布测试版, 20181024 程序员节日的时候才发布 v1.0 正式版,为 Go 生态发展添砖加瓦。开源以来快速迭代、发展成长,广受开发者和企业的青睐,也有许多的开发者加入了贡献行列。 GoFrame 原本是为开发团队设计的,因此她的开发效率和可维护性做得非常好,有着很高的代码质量以及丰富的单元测试和示例,并且 GoFrame 是目前中文化文档做的最好的 Golang 开发框架。

Change Log

  1. 应多数开发者的要求,框架要求的最低 Golang 运行版本降级为了 v1.11
  2. 新增 GoFrame 视频教程地址:
  3. 将不常用的 guuid 模块迁移到 github.com/gogf/guuid 作为社区模块维护,保持 gf 主仓库的轻量级。
  4. 新增 guid 模块,用于高效轻量级的唯一字符串生成: https://goframe.org/util/guid/index

tool chain

  1. 工具链更新: https://goframe.org/toolchain/cli
  2. 新增 gf env 命令,更优雅地查看当前 Golang 环境变量信息。
  3. 新增 gf mod path 命令,用于将当前 go modules 包拷贝到 GOPATH 中,以便使用原始的 GOPATH 方式开发项目。
  4. 对现有 cli 命令进行了一些改进,提高使用体验;预编译二进制版本在部分平台下提供了 upx 压缩,使得下载的文件更小。

container

  1. garray
    • https://goframe.org/container/garray/index
    • 简化数组使用方式,支持类似于 var garray.Array 的变量定义使用方式;
    • 增加 Walk 方法,用于自定义的数组元素处理方法;
    • 增加 ContainsI 方法,用于大小写忽略匹配的数组元素项存在性查找;
    • 完善单元测试,代码覆盖率 94%
    • 代码改进,提高性能;
    • 修复一些问题;
  2. gchan
    • 由于该封装包实际意义不是很大,因此从主框架中删除;
  3. glist
  4. gmap
  5. gset
    • https://goframe.org/container/gset/index
    • 简化集合使用方式,支持类似于 var gset.Set 的变量定义使用方式;
    • 增加 Walk 方法,用于自定义的集合元素处理方法;
    • 完善单元测试,代码覆盖率 90%
    • 代码改进,提高性能;
  6. gtree
  7. gvar

database

  1. gdb
  2. gredis
    • 增加 MaxActive 连接池参数默认配置为 100,限制默认的连接数量;
    • 改进 Conn 连接对象的 Do 方法,支持对 map/slice/struct 类型进行自动的 json.Marshal 处理,注意获取数据时使用 DoVar 方法获取: https://goframe.org/database/gredis/usage
    • 完善单元测试,代码覆盖率 72%

net

  1. ghttp

    • 增加 PrefixRetry 客户端链式操作方法;
    • 增加客户端原始请求打印特性: https://goframe.org/net/ghttp/client/demo/dump
    • 增加 ClientMaxBodySize 的服务端配置,用于限制客户端提交的 Body 大小,默认为 8MB;在涉及到上传的Server中需要增加该配置的大小,在配置文件中指定对应的大小即可,如 ClientMaxBodySize="100MB"https://goframe.org/net/ghttp/config
    • 改进 SessionId 生成的随机性,提高 Session 安全性: https://goframe.org/os/gsession/index
    • 改进 ghttp.Server 实现了标准库的 http.Handler 接口,便于与其他第三方的服务如 Prometheus 进行代码集成;
    • 其他大量的代码细节改进工作,提高性能及持久维护性;
    • 完善单元测试,代码覆盖率 61%
  2. gipv4

    • 增加 GetIpArray 方法,用于获取当前主机的所有IPv4地址;
    • 增加 GetMacArrayGetMac 方法,用于获取当前主机的 MAC 地址信息;
    • 修改 IntranetIP 方法名称为 GetIntranetIp,修改 IntranetIPArray 方法名称为 GetIntranetIpArray

encoding

  1. gjson
    • 新增 GetMaps 获取 JSON 内部节点变量方法;
    • 改进 NewWithTag 方法对 map/struct 的处理;
    • 完善单元测试,代码覆盖率 77%
  2. gyaml
    • 升级依赖的第三方 yaml 解析包,解决了 map[interface{}]interface{} 转换问题;

error

  1. gerror
    • 新增 NewfSkip 方法,用于创建 skip 指定堆栈的错误对象;
    • 放开框架所有的堆栈链路打印,展示错误时真实的链路调用详情;

os

  1. gcache

    • 增加 GetVar 方法,用于获得可以便捷转换为其他数据类型的”泛型”变量;
    • 标记 Removes 方法废弃,改进 Remove 方法参数为不定参数,统一使用 Remove 方法删除单个/多个键值对;
    • 完善单元测试,代码覆盖率 96%
  2. genv

    • 增加 GetVar 方法,用于获得可以便捷转换为其他数据类型的”泛型”变量;
  3. gfile

    • 改进 CopyDir/CopyFile 复制目录/文件方法;
    • 新增 ScanDirFunc 方法,用于支持自定义处理回调的目录检索;
    • 完善单元测试,代码覆盖率 64%
  4. glog

  5. gres

    • 改进打包特性,增强生成二进制文件及Go文件的压缩比,比旧版本增加 20% 压缩率,使得编译生成的二进制文件体积更小;
    • 代码结构改进,提高执行效率及可持久维护性;
  6. gsession

    • 改进 SessionId 默认生成方法,采用 guid.S 方法生成;
    • 增加 SetIdSetIdFunc 方法,用于自定义 SessionId 及自定义的 SessionId 生成方法;

frame

  1. g
    • 新增 g.Table 方法,用于快速创建数据库模型操作对象;

i18n

  1. gi18n
    • 新增 GetContent 方法,用于获取指定 i18n 关键字为转译内容;
    • 改进代码细节,提高性能和持久可维护性;
    • 完善单元测试,代码覆盖率 74%

test

  1. gtest
    • 增加 AssertNQ 断言方法,用于强类型的不相等判断;

text

  1. gstr
    • 增加 SubStrRune 方法,用于支持 unicode 的字符串截取;
    • 增加 StrLimitRune 方法,用于支持 unicode 的字符串截断隐藏;
    • 增加 LenRune 方法,用于替换 RuneLen 方法,统一方法命名风格;
    • 增加 PosRune/PosIRune/PosRRune/PosRIRune 方法,用于支持 unicode 的字符串左右位置查找;
    • 增加 CompareVersionGo 方法,用于 Golang 风格的版本号大小比较;
    • 完善单元测试,代码覆盖率 75%

util

  1. gconv

    • 改进 Convert 转换方法,支持常见 map 类型的转换;
    • 改进类型转换过程中异常错误的捕获,通过 error 返回;
    • 其他一些细节改进;
    • 完善单元测试,代码覆盖率 63%
  2. grand

    • 增加 B 方法,用于获得随机的二进制数据;
    • 改进代码底层实现,部分接口性能提高 50%
    • 完善单元测试,代码覆盖率 74%
  3. guid

  4. gutil

    • 增加 MapContains 方法,用于判断map中是否包含指定键名;
    • 增加 MapDelete 方法,用于删除map中指定的键名,可以为多个键名;
    • 增加 MapMerge 方法,用于合并两个map;
    • 增加 MapMergeCopy 方法,用于拷贝多个map;
    • 增加 MapContainsPossibleKey 方法,用于查找指定键名,忽略大小写及字符 '-'/'_'/'.'/' '
  5. gvalid

    • 所有默认的错误提示改为了英文;
    • 错误提示的配置改为了通过 i18n 来配置实现,以便支持国际化: https://goframe.org/util/gvalid/message
    • 身份证号规则名称从 id-number 改为了 resident-id
    • 银行卡号规则名称从 luhn 改为了 bank-card
    • 完善单元测试,代码覆盖率 96%

Bug Fix

  1. 修复 gcompress 的多文件 zip 压缩问题;
  2. 修复 ghttp.Client 获取返回的过期 Cookie 的问题;
  3. 修复 gres.File 对于 http.File 接口的实现细节;
  4. 修复 garray.Pop* 方法的边界问题;
  5. 修复 gresReaddir 方法参数为 0 时报错的问题;
  6. 其他一些修复: https://github.com/gogf/gf/issues?q=is%3Aissue+label%3Abug