大家好啊!久等啦!
由于自从上次版本的发布以来,越来越多小伙伴加入了GF的大家庭,并提供了许多不错的建议和反馈,这次版本对其中大部分反馈进行了处理,包括大部分的改进建议和部分新特性,因此这次的版本发布时隔了两个多月。GF非常注重代码质量以及可持续维护性,这次版本也进一步对框架大部分模块的示例、注释和单元测试用例进行了完善,目前单元测试用例数量约为1991例,代码覆盖率为71%,覆盖了所有模块的绝大部分主要功能。
GF框架提供了比较常用、高质量的基础开发模块,轻量级、模块化、高性能,推荐大家阅读框架源码了解更多细节。本次发布有个别的不兼容升级,往往批量替换即可,以下change log比较完善,建议升级前仔细阅读。
本次发布即意味下一版本开发计划的开启,欢迎更多小伙伴参与开源贡献: https://github.com/gogf/gf/projects/8
感谢大家支持! Enjoy your GF!
GF(Go Frame)是一款模块化、高性能、生产级的 Go 基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、对象池、配置管理、资源管理、数据校验、数据编码、定时任务、数据库 ORM 、TCP/UDP 组件、进程管理 /通信等等。并提供了 Web 服务开发的系列核心组件,如:Router 、Cookie 、Session 、Middleware 、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、TLS/HTTPS 、Rewrite 等特性。
从GF v1.12版本开始,框架要求的最低Golang运行版本为v1.13,由于Golang新版本都是向后兼容的,因此推荐大家更新使用Golang新版本: https://golang.google.cn/dl/
本次版本也新增了
Swagger的工具及插件支持,另行独立发布。
tool chaingen model命令新增对pgsql/mssql/sqlite/oracle的模型生成支持。gen model命令生成模型新增公开包变量Columns用于获得表的字段名称。netghttp
Server默认关闭了平滑重启特性。开发者可以通过相应的配置选项打开。Client.Get方法,增加可选的请求参数。Client链式操作方法:Header, HeaderRaw, Cookie, ContentType, ContentJson, ContentXml, Timeout, BasicAuth, Ctx: https://goframe.org/net/ghttp/client/chainRequest.GetCtx/GetCtxVar/SetCtxVar/Context上下文变量管理方法,用于请求内部的上下文变量特性:
Request.GetUploadFile/GetUploadFiles方法,以及UploadFile类型,极大简化文件上传处理逻辑: https://goframe.org/net/ghttp/client/demo/uploadRequest.GetPage方法,用于便捷地获得分页对象:
Response.Redirect*方法,增加自定义的跳转 HTTP 状态码参数。CORS特性,完善跨域功能处理,并完全遵守W3C关于OPTIONS请求方法的规范约定: https://goframe.org/net/ghttp/corsRequest内置变量,用于模板获得请求参数。由于GF框架的模板引擎采用两级缓存设计,减少IO开销的同时提升了执行效率,即使增加了大量的内置变量以及内置方法,经过大规模的性能测试,性能比其他WebServer库相同逻辑下高出50% - 200%的效率。Server实验性的Plugin特性。Server底层路由存储、检索逻辑,优化代码,提升效率。Server日志处理。databasegdb
Driver驱动接口设计,方便开发者自定义驱动实现。新增Register包方法,用于开发者注册自定义的数据库类型驱动: https://goframe.org/database/gdb/driverGetArray接口及实现,用于获取指定字段列的数据,构造成数组返回: https://goframe.org/database/gdb/chaining/selectInsertIgnore接口及实现,用于写入时忽略写入冲突,仅对mysql数据库类型有效: https://goframe.org/database/gdb/chaining/insert-saveSchema接口及实现,用于动态切换并获取指定名称的数据库对象: https://goframe.org/database/gdb/chaining/schemaFieldsStr/FieldsExStr模型方法,用于获取表字段,并构造成字符串返回:hhttps://goframe.org/database/gdb/chaining/fields-retrieveLockUpdate/LockShared模型链式操作方法,用于实现悲观锁操作: https://goframe.org/database/gdb/chaining/lockWhere/Data方法对更新参数输入方式的支持,提高灵活性:
Result新增Array方法,用于获得指定字段的数值,构造成数组返回: https://goframe.org/database/gdb/resultOmitEmpty方法对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类型使得时间控制更灵活。osglog
Rotation日志滚动切分特性,新增按照文件大小或过期时间进行日志切分,并支持切分文件数量限制、对日志文件进行自动压缩、可自定义压缩级别(1-9)、支持对切分文件过期时间清理: https://goframe.org/os/glog/rotateLevelPrefixes特性,支持对日志级别的前缀名称进行自定义: https://goframe.org/os/glog/levelSetLevelStr方法,并增加按照字符串进行日志级别配置的特性:
SetDefaultLogger包方法,用于设置全局默认的Logger对象。gres
15MB的网站静态资源文件(css/js/html等),资源文件打包后约为4MB左右: https://goframe.org/os/gres/indexgcfg
toml配置文件在配置目录中存在时,将自动设置该单例对象的默认配置文件为该文件。例如:g.Cfg("redis")获取到的单例对象将会默认去检索并设置默认的配置文件为redis.toml,当该文件不存在时,则使用默认的配置文件(config.toml): https://goframe.org/net/ghttp/configgview
concat内置字符串拼接方法: https://goframe.org/os/gview/function/buildingfile
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平台下不同表现的处理。encodinggjson
frameg
IsNil方法,用于判断当前给定的变量是否为nil,该方法有可能会使用到反射来实现判断。IsEmpty方法,用于判断当前给定的变量是否为空,该方法优先使用断言判断但有可能会使用到反射来实现判断。空值包括:0, nil, false, "", len(slice/map/chan) == 0。SetServerGraceful方法,转而统一交给Server的配置来管理。gins
gmvc
M类型,为*gdb.Model的别名简称,用于工具链自动生成模型中的M属性。textgstr
HasPrefix/HasSuffix方法。OctStr方法,用于将八进制字符串转换为其对应的unicode字符串,例如转换为中文。常用于gRPC底层通信编码中。debuggdebug
TestDataPath方法,用于当前包单元测试中获得当前包中testdata目录的绝对路径。utilgconv
String字符串转换方法,增加对time.Time/*time.Time/gtime.Time类型的内置支持。Map/Struct转换方法,增加对一些特殊场景的细节处理。经过大规模的使用,大量的反馈改进,不断完善了细节。Struct转换方法,增加对UnmarshalValue(interface{}) error接口的支持。grand
Str方法更名为S方法,用以获取指定长度的随机字符串、数字,并增加symbol参数,指定是否可以随机返回特殊可见字符。Str方法,用于从指定的字符串字符中随机获取指定长度的字符串。该方法同时支持unicode字符串,例如:中文: https://goframe.org/util/grand/indexSymbols方法,用于随机返回指定场孤独的特殊可见字符: https://goframe.org/util/grand/indexgvalid
unicode字符串的支持,例如:中文。Server的视图对象配置失效问题。Server中间件在中间件panic情况下,忽略Middleware.Next方法控制,导致鉴权中间件失效的问题。gudp.Server在请求包大小超过64bytes时的断包问题,并调整默认缓冲区大小为1024byte,开发者可自定义缓冲区大小。gfile.MTimeMillisecond方法返回错误的文件修改毫秒时间戳。gconv.Int64对负数转换的支持。这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.