大家好啊!久等啦!
由于自从上次版本的发布以来,越来越多小伙伴加入了GF
的大家庭,并提供了许多不错的建议和反馈,这次版本对其中大部分反馈进行了处理,包括大部分的改进建议和部分新特性,因此这次的版本发布时隔了两个多月。GF
非常注重代码质量以及可持续维护性,这次版本也进一步对框架大部分模块的示例、注释和单元测试用例进行了完善,目前单元测试用例数量约为1991
例,代码覆盖率为71%
,覆盖了所有模块的绝大部分主要功能。
GF
框架提供了比较常用、高质量的基础开发模块,轻量级、模块化、高性能,推荐大家阅读框架源码了解更多细节。本次发布有个别的不兼容升级,往往批量替换即可,以下change log
比较完善,建议升级前仔细阅读。
本次发布即意味下一版本开发计划的开启,欢迎更多小伙伴参与开源贡献:https://github.com/gogf/gf/projects/8
感谢大家支持!Enjoy your GF
!
GoFrame
GF(Go Frame)
是一款模块化、高性能、生产级的Go基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、对象池、配置管理、资源管理、数据校验、数据编码、定时任务、数据库ORM、TCP/UDP组件、进程管理/通信等等。并提供了Web服务开发的系列核心组件,如:Router、Cookie、Session、Middleware、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、TLS/HTTPS、Rewrite等特性。
特点
- 模块化、松耦合设计;
- 模块丰富,开箱即用;
- 简便易用,易于维护;
- 社区活跃,大牛谦逊低调脾气好;
- 高代码质量、高单元测试覆盖率;
- 详尽的开发文档及示例;
- 完善的本地中文化支持;
- 更适合企业及团队使用;
地址
Change Log
从GF v1.12
版本开始,框架要求的最低Golang
运行版本为v1.13
,由于Golang
新版本都是向后兼容的,因此推荐大家更新使用Golang
新版本:https://golang.google.cn/dl/
本次版本也新增了
Swagger
的工具及插件支持,另行独立发布。
tool chain
gen model
命令新增对pgsql/mssql/sqlite/oracle
的模型生成支持。gen model
命令生成模型新增公开包变量Columns
用于获得表的字段名称。
net
ghttp
- 注意:从该版本开始,
Server
默认关闭了平滑重启特性。开发者可以通过相应的配置选项打开。 - 改进
Client.Get
方法,增加可选的请求参数。 - 新增
Client
链式操作方法:Header
,HeaderRaw
,Cookie
,ContentType
,ContentJson
,ContentXml
,Timeout
,BasicAuth
,Ctx
:https://goframe.org/net/ghttp/client/chain - 新增
Request.GetCtx/GetCtxVar/SetCtxVar/Context
上下文变量管理方法,用于请求内部的上下文变量特性: - 新增
Request.GetUploadFile/GetUploadFiles
方法,以及UploadFile
类型,极大简化文件上传处理逻辑:https://goframe.org/net/ghttp/client/demo/upload - 新增
Request.GetPage
方法,用于便捷地获得分页对象: - 改进
Response.Redirect*
方法,增加自定义的跳转HTTP状态码参数。 - 改进
CORS
特性,完善跨域功能处理,并完全遵守W3C
关于OPTIONS
请求方法的规范约定:https://goframe.org/net/ghttp/cors - 模板视图对象增加
Request
内置变量,用于模板获得请求参数。由于GF
框架的模板引擎采用两级缓存设计,减少IO
开销的同时提升了执行效率,即使增加了大量的内置变量以及内置方法,经过大规模的性能测试,性能比其他WebServer
库相同逻辑下高出50% - 200%
的效率。 - 新增
Server
实验性的Plugin
特性。 - 改进
Server
底层路由存储、检索逻辑,优化代码,提升效率。 - 改进分组路由注册的源码位置记录功能,当路由注册冲突时能够精准定位及提示重复路由源码位置。
- 改进
Server
日志处理。 - 完善单元测试。
- 注意:从该版本开始,
database
gdb
- 代码重构改进,增加
Driver
驱动接口设计,方便开发者自定义驱动实现。新增Register
包方法,用于开发者注册自定义的数据库类型驱动:https://goframe.org/database/gdb/driver - 新增
GetArray
接口及实现,用于获取指定字段列的数据,构造成数组返回:https://goframe.org/database/gdb/model/select - 新增
InsertIgnore
接口及实现,用于写入时忽略写入冲突,仅对mysql
数据库类型有效:https://goframe.org/database/gdb/model/insert-save - 新增
Schema
接口及实现,用于动态切换并获取指定名称的数据库对象:https://goframe.org/database/gdb/model/schema - 新增
FieldsStr/FieldsExStr
模型方法,用于获取表字段,并构造成字符串返回:https://goframe.org/database/gdb/model/fields-retrieve - 新增
LockUpdate/LockShared
模型链式操作方法,用于实现悲观锁操作:https://goframe.org/database/gdb/model/lock - 改进
Where/Data
方法对更新参数输入方式的支持,提高灵活性: - 查询结果对象
Result
新增Array
方法,用于获得指定字段的数值,构造成数组返回:https://goframe.org/database/gdb/result - 改进
OmitEmpty
方法对Data
输入参数的过滤,当给定的Data
参数为空时间对象时,将会被过滤。 - 增加默认的数据库连接池参数:
MaxIdleConns=10
。 - 其他一些改进。
- 完善单元测试。
- 代码重构改进,增加
gredis
- 增加/修改默认的数据库连接池参数:
MaxIdle=10
,IdleTimeout=10s
,MaxConnLifetime=30s
,Wait=true
。 - 完善单元测试。
- 增加/修改默认的数据库连接池参数:
container
所有容器对象新增
UnmarshalValue(interface{}) error
接口方法实现,用于gconv
转换时根据任意类型变量创建/设置对象内容,GF
框架的所有容器对象均实现了该接口。garray
- 新增
RemoveValue
方法,用于根据数值检索并删除元素项。 - 新增
FilterNil
方法,用于遍历并删除数组中的nil
元素项。 - 新增
FilterEmpty
方法,用于遍历并删除数组中的空值元素项,空值包括:0, nil, false, "", len(slice/map/chan) == 0
。 - 改进
Set/Fill/InsertBefore/InsertAfter
方法严谨性,将原有的链式操作返回值对象修改为error
返回值。 - 改进
Get/Remove/PopRand/PopLeft/PopRight/Rand
方法严谨性,增加found
的bool
返回值,标识当前方法是否有数据返回,当空数组或者操作越界时found
返回值为false
。 - 改变
Rands
方法原有逻辑,保证按照给定大小返回随机数组。 - 完善单元测试。
- 新增
gpool
- 调整缓存池过期时间参数类型,旧版本为
int
类型表示毫秒,新版本为time.Duration
类型使得时间控制更灵活。 - 内部代码优化,性能改进。
- 完善单元测试。
- 完善注释。
- 调整缓存池过期时间参数类型,旧版本为
os
glog
- 增加
Rotation
日志滚动切分特性,新增按照文件大小或过期时间进行日志切分,并支持切分文件数量限制、对日志文件进行自动压缩、可自定义压缩级别(1-9
)、支持对切分文件过期时间清理:https://goframe.org/os/glog/rotate - 新增
LevelPrefixes
特性,支持对日志级别的前缀名称进行自定义:https://goframe.org/os/glog/level - 新增
SetLevelStr
方法,并增加按照字符串进行日志级别配置的特性: - 新增
SetDefaultLogger
包方法,用于设置全局默认的Logger
对象。
- 增加
gres
- 改进资源内容编码设计,采用新的压缩算法,减少资源文件大小,例如原本
15MB
的网站静态资源文件(css/js/html
等),资源文件打包后约为4MB
左右:https://goframe.org/os/gres/index - 注意:该改进与旧版本无法兼容,需要重新打包原有的资源文件。
- 完善单元测试。
- 改进资源内容编码设计,采用新的压缩算法,减少资源文件大小,例如原本
gcfg
- 去掉配置对象属性的原子并发安全控制,改为普通变量类型。由于配置管理是最常用模块之一,因此确保高效的设计及方法实现。
- 单例对象做较大调整:为方便多文件场景下的配置文件调用,简便使用并提高开发效率,因此当给定的单例名称对应的
toml
配置文件在配置目录中存在时,将自动设置该单例对象的默认配置文件为该文件。例如:g.Cfg("redis")
获取到的单例对象将会默认去检索并设置默认的配置文件为redis.toml
,当该文件不存在时,则使用默认的配置文件(config.toml
):https://goframe.org/net/ghttp/config - 完善单元测试。
gview
- 新增
concat
内置字符串拼接方法:https://goframe.org/os/gview/function/buildin - 完善单元测试。
- 新增
gfile
- 改进
SelfPath
获取当前执行文件路径方法,提高执行效率。 - 改进
Join
文件路径连接方法,防止多余的路径连接符号。 - 改建
GetContents
文件内容获取方法执行效率,降低内存占用。 - 新增
StrToSize
方法,用于将大小字符串转换为字节数字,大小字符串例如10m
,5KB
,1.25Gib
等。 - 新增
ReadLines/ReadByteLines
方法,用于按行读取指定文件内容,并给定读取回调函数。 - 完善单元测试。
- 改进
gtime
- 改进
gtime.Time
对象实现,统一字符串打印时间格式为Y-m-d H:i:s
,如:2020-01-01 12:00:00
。
- 改进
gcmd
- 命令行解析方法增加
strict
参数,用于设置当前解析是否严格解析,严格解析下如果给定了非法的选项,将会停止解析并返回错误。默认情况下为非严格解析。
- 命令行解析方法增加
genv
- 改进
Remove
删除环境变量键值对方法,增加对多个键值对环境变量的删除。
- 改进
gfpool
- 改进代码实现,提高效率。
- 完善单元测试。
gfsnotify
- 改进包初始化方法,当系统原因引起默认
Watcher
对象创建失败时,直接panic
。
- 改进包初始化方法,当系统原因引起默认
gproc
- 改进
SearchBinaryPath
方法。 - 改进
Process.Kill
方法在windows
及*niux
平台下不同表现的处理。
- 改进
encoding
gjson
- 代码改进、完善注释、新增大量代码示例。
- 文档更新:
- 基本介绍:https://goframe.org/encoding/gjson/index
- 对象创建:https://goframe.org/encoding/gjson/object
- 层级访问:https://goframe.org/encoding/gjson/pattern
- Struct转换:https://goframe.org/encoding/gjson/conversion-struct
- 动态创建修改:https://goframe.org/encoding/gjson/dataset
- 数据格式转换:https://goframe.org/encoding/gjson/conversion-format
frame
g
- 新增
IsNil
方法,用于判断当前给定的变量是否为nil
,该方法有可能会使用到反射来实现判断。 - 新增
IsEmpty
方法,用于判断当前给定的变量是否为空
,该方法优先使用断言判断但有可能会使用到反射来实现判断。空值包括:0, nil, false, "", len(slice/map/chan) == 0
。 - 标记废弃
SetServerGraceful
方法,转而统一交给Server
的配置来管理。
- 新增
gins
- 改进代码结构,方便维护。
- 改进、完善单元测试。
gmvc
- 新增
M
类型,为*gdb.Model
的别名简称,用于工具链自动生成模型中的M
属性。
- 新增
text
gstr
- 新增
HasPrefix/HasSuffix
方法。 - 新增
OctStr
方法,用于将八进制字符串转换为其对应的unicode
字符串,例如转换为中文。常用于gRPC
底层通信编码中。 - 完善单元测试。
- 新增
debug
gdebug
- 改进代码结构,方便维护。
- 新增
TestDataPath
方法,用于当前包单元测试中获得当前包中testdata
目录的绝对路径。
util
gconv
- 改进
String
字符串转换方法,增加对time.Time/*time.Time/gtime.Time
类型的内置支持。 - 改进
Map/Struct
转换方法,增加对一些特殊场景的细节处理。经过大规模的使用,大量的反馈改进,不断完善了细节。 - 改进
Struct
转换方法,增加对UnmarshalValue(interface{}) error
接口的支持。 - 完善单元测试。
- 改进
grand
- 注意:不兼容调整,原有的
Str
方法更名为S
方法,用以获取指定长度的随机字符串、数字,并增加symbol
参数,指定是否可以随机返回特殊可见字符。 - 新增
Str
方法,用于从指定的字符串字符中随机获取指定长度的字符串。该方法同时支持unicode
字符串,例如:中文:https://goframe.org/util/grand/index - 新增
Symbols
方法,用于随机返回指定场孤独的特殊可见字符:https://goframe.org/util/grand/index - 完善单元测试。
- 注意:不兼容调整,原有的
gvalid
- 长度校验规则增加对
unicode
字符串的支持,例如:中文。
- 长度校验规则增加对
Bug Fix
- 修复
Server
的视图对象配置失效问题。 - 修复
Server
中间件在中间件panic
情况下,忽略Middleware.Next
方法控制,导致鉴权中间件失效的问题。 - 修复
gudp.Server
在请求包大小超过64bytes
时的断包问题,并调整默认缓冲区大小为1024byte
,开发者可自定义缓冲区大小。 - 修复
gfile.MTimeMillisecond
方法返回错误的文件修改毫秒时间戳。 - 修复
gconv.Int64
对负数转换的支持。 - 其他一些修复。
- 详见:https://github.com/gogf/gf/issues?q=label%3Abug