GoFrame v1.15 发布,企业级 Go 开发框架

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

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

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

GoFrame

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

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

特点

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

Change Logs

  1. ghttp
    • 改建HTTPClientGET请求相关方法,当传递参数时不再作为Body参数提交,而是自动构造为QueryString提交。以保证与其他服务端的兼容能力。
    • 请求对象Request增加默认值设置特性:
    • 增加Request.SetCtx方法,用于自定义上下文变量,常用于中间件/拦截器中:
    • 模板解析中增加Request变量,用于获得客户端提交的请求参数,无论是QueryString/Form类型参数:
    • Cookie功能改进,如何设置与Session有效期保持一致的Cookie,请参考:Cookie#Cookie会话过期
    • 分组路由注册增加ALLMap方法,用于批量注册路由:分组路由#批量注册
    • 新增CRSF插件介绍文档:
    • 其他一些功能及细节改进。
  2. gdb
    • 增加Ctx方法,用于异步IO控制或传递自定义的上下文信息,特别是链路跟踪信息:
    • 增加Raw类型,用于原始SQL语句嵌入,该语句将会直接提交到底层数据库驱动,不会做任何处理:写入保存#RawSQL语句嵌入更新删除#RawSQL语句嵌入
    • 改进Fields/Fields/Data方法,增加对输入map/struct参数与数据表字段的自动映射检测、过滤:
    • 增加InsertedAt/UpdatedAt/DeletedAt字段名称的配置,增加TimeMaintainDisabled配置可关闭时间填充及软删除特性:
    • 增加Counter更新特性,用于字段的增加/减少操作:更新删除#Counter更新特性
    • 改进ORM时区处理,详情请参考章节:
    • 其他关于性能和易用性的细节改进。
    • 一些细节问题改进。
    • 完善单元测试。
  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
*   改进默认参数解析获取方式:
*   增加`GetWithEnv`方法,当命令行中不存在指定参数时,同时从环境变量中获取:
  1. genv
*   增加`SetMap`方法,用于批量设置环境变量。
*   增加`GetWithCmd`方法,当环境变量中不存在指定参数时,同时从命令行参数中获取:
  1. gfile
*   标记废弃`ReadByteLines`方法,新增`ReadLinesBytes`方法。
*   调整`ReadLines/ReadLinesBytes`方法回调函数定义,增加`error`返回。
  1. glog
*   改进滚动更新功能。
*   其他一些细节改进。
  1. gsession
*   增加`SetMap`方法,用于批量设置键值对数据。
  1. gtimer
*   常量名称改进,统一采用大驼峰方式。
  1. gview
*   增加内置模板函数`map`,用于将参数转换为`map[string]interface{}`类型。
*   增加内置模板函数`maps`,用于将参数转换为`[]map[string]interface{}`类型。
*   增加内置模板函数`json`,用于将参数转换为`JSON`字符串类型。
*   文档更新:
*   其他一些细节改进。
  1. gconv
*   性能改进。
*   功能改进(细节改进有点多,实在不想写得太详细)。
*   代码更加健壮。
*   单元测试完善。
  1. 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. 其他一些错误修复。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352