大家好呀!自上次发布到现在,从初秋到深冬,我们也完全冇闲着哟,我们这次带来了爱心满满的`GoFrame v1.15`版本。此外,还有两件事:
* `GoFrame`被`OSC`开源中国评选为了`2020`年度`TOP30`的开源项目:[https://www.oschina.net/question/2918182\_2320114](https://www.oschina.net/question/2918182_2320114) ,感谢大家的认可与支持!同时`GoFrame`也是`Gitee GVP` [最有价值项目](https://gitee.com/johng/gf)。
* `GoFrame`官网船新改版,里挤需体验三番钟,里造会干我一样,爱上介款框架:[https://goframe.org](https://goframe.org) 。感谢[Atlassian](https://www.atlassian.com/)的赞助,提供的全产品线正版授权码!
经过多年的潜心修炼和稳定发展,`GoFrame`已经逐步成长为了一款企业级的`Golang`基础开发框架,她提供了项目开发规范、开发工具链、完善的基础模块、丰富的开发文档、高代码质量以及活跃的社区。为保证框架质量,我们为各个组件进行了大量的单元测试以保证逻辑的正确(`2534`例测试单元,`9097`项测试断言),同时维护了高质量的文档,至今,已有很多的大型/中小型互联网公司在生产环境使用`GoFrame`。
开源不易,有你们的理解和支持,幸福满满!感谢所有参与项目开发的小伙伴们,爱你们!`GF, YES!`
## `GoFrame`
`GF(Go Frame)`是一款模块化、高性能、企业级的`Go`基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、配置管理、资源管理、数据校验、定时任务、数据库`ORM`、`TCP/UDP`组件、进程管理/通信等等。并提供了`Web`服务开发的系列核心组件,如:`Router`、`Cookie`、`Session`、`Middleware`、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、`TLS/HTTPS`、`Rewrite`等特性。
> 如果您初识`Go`语言,您可以将`GoFrame`类似于`PHP`中的`Laravel`, `Java`中的`SpringBoot`或者`Python`中的`Django`。
## 特点
* 模块化、松耦合设计;
* 模块丰富、开箱即用;
* 简便易用、易于维护;
* 高代码质量、高单元测试覆盖率;
* 社区活跃,大牛谦逊低调脾气好;
* 详尽的开发文档及示例;
* 完善的本地中文化支持;
* 设计为团队及企业使用;
## Change Logs
1. `ghttp`
* 改建`HTTPClient`的`GET`请求相关方法,当传递参数时不再作为`Body`参数提交,而是自动构造为`QueryString`提交。以保证与其他服务端的兼容能力。
* 请求对象`Request`增加默认值设置特性:
* 增加`Request.SetCtx`方法,用于自定义上下文变量,常用于中间件/拦截器中:
* 模板解析中增加`Request`变量,用于获得客户端提交的请求参数,无论是`QueryString/Form`类型参数:
* `Cookie`功能改进,如何设置与`Session`有效期保持一致的`Cookie`,请参考:[Cookie#Cookie会话过期](https://itician.org/display/gf/Cookie#Cookie-Cookie%E4%BC%9A%E8%AF%9D%E8%BF%87%E6%9C%9F)
* 分组路由注册增加`ALLMap`方法,用于批量注册路由:[分组路由#批量注册](https://itician.org/pages/viewpage.action?pageId=1114517#id-%E5%88%86%E7%BB%84%E8%B7%AF%E7%94%B1-%E6%89%B9%E9%87%8F%E6%B3%A8%E5%86%8C)
* 新增`CRSF`插件介绍文档:
* 其他一些功能及细节改进。
2. `gdb`
* 增加`Ctx`方法,用于异步`IO`控制或传递自定义的上下文信息,特别是链路跟踪信息:
* 增加`Raw`类型,用于原始`SQL`语句嵌入,该语句将会直接提交到底层数据库驱动,不会做任何处理:[写入保存#RawSQL语句嵌入](https://itician.org/pages/viewpage.action?pageId=1114344#id-%E5%86%99%E5%85%A5%E4%BF%9D%E5%AD%98-RawSQL%E8%AF%AD%E5%8F%A5%E5%B5%8C%E5%85%A5)、[更新删除#RawSQL语句嵌入](https://itician.org/pages/viewpage.action?pageId=1114238#id-%E6%9B%B4%E6%96%B0%E5%88%A0%E9%99%A4-RawSQL%E8%AF%AD%E5%8F%A5%E5%B5%8C%E5%85%A5)
* 改进`Fields/Fields/Data`方法,增加对输入`map/struct`参数与数据表字段的自动映射检测、过滤:
* 增加`InsertedAt/UpdatedAt/DeletedAt`字段名称的配置,增加`TimeMaintainDisabled`配置可关闭时间填充及软删除特性:
* 增加`Counter`更新特性,用于字段的增加/减少操作:[更新删除#Counter更新特性](https://itician.org/pages/viewpage.action?pageId=1114238#id-%E6%9B%B4%E6%96%B0%E5%88%A0%E9%99%A4-Counter%E6%9B%B4%E6%96%B0%E7%89%B9%E6%80%A7)
* 改进`ORM`时区处理,详情请参考章节:
* 其他关于性能和易用性的细节改进。
* 一些细节问题改进。
* 完善单元测试。
3. `gerror`
1. 增加`Newf/NewSkipf`方法创建错误对象:
2. 增加对错误码特性的支持:
3. 完善单元测试。
4. `gvalid`
* 增加`phone-loose`宽松手机号校验规则,只要满足 `13/14/15/16/17/18/19`开头的`11`位数字都可以通过验证。
* 返回校验错误实现了`gerror`的`Current() 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](https://github.com/gogf/gf/issues/1004) ,临时删除了`internal/json`包中对第三方包 [github.com/json-iterator/go](http://github.com/json-iterator/go) 的依赖,还原为标准库`encoding/json`。
* 改进`internal/structs`包,由于该包在`struct`转换特性中使用比较频繁,因此去掉第三方包 [github.com/gqcn/structs](http://github.com/gqcn/structs) 的依赖,简化了反射处理逻辑,提高了性能以及易用性,提高了长期维护性。
* `internal/utils`包增加`RemoveSymbols`方法,用于删除字符串中的特殊字母。改进`EqualFoldWithoutChars`方法,去掉对字符串中字符串的正则过滤功能,极大提高了方法性能。不要小看这两个小函数,性能的点滴改进能提高框架中其他涉及到复杂类型转换模块的性能。`internal`包虽然不直接对外暴露方法,但是却影响着框架中的一些核心组件性能。
9. `gcfg`
* 改进单例名称的配置对象获取,增加自动检测文件类型功能:[配置管理-单例对象#自动检索特性](https://itician.org/pages/viewpage.action?pageId=1114194#id-%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86%E5%8D%95%E4%BE%8B%E5%AF%B9%E8%B1%A1-%E8%87%AA%E5%8A%A8%E6%A3%80%E7%B4%A2%E7%89%B9%E6%80%A7)
* 其他一些细节改进。
10. `gcmd`
* 改进默认参数解析获取方式:
* 增加`GetWithEnv`方法,当命令行中不存在指定参数时,同时从环境变量中获取:
11. `genv`
* 增加`SetMap`方法,用于批量设置环境变量。
* 增加`GetWithCmd`方法,当环境变量中不存在指定参数时,同时从命令行参数中获取:
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/gtree`的`Clone`方法并发安全判断问题。
2. 修复当设置了过期方法,但`gpool`在元素项过期时没有自动调用过期方法处理的问题。
3. 修复`gfile.ReadLInes/ReadLineBytes`在数据量大时的读取重复问题。
4. 其他一些错误修复。
开源中国社区? 呵呵呵. 这个米田共社区的评价也当回事么? 毫无权威性.
当然这并不是说楼主的goframe不好.goframe虽然没用过, 但是应该是很不错的.
只是说那个社区的低素质人渣太多, 还有沽名钓誉自我感觉良好自封牛人的无耻之尤有个什么叫红薯的.
选型之前, 国产的框架以前只看过别人对beego的评价, 说是代码写的一塌糊涂, 可维护性很不好, 而且也许久不更新了.
后来就选了iris, 号称性能最强, 但是后来用下来发现不够稳定, 最后还是切换到start最多的gin上.
这些框架其实大同小异, 只要不是代码写的太差, 性能差距不会很大, 就是稳定性质量有所区别, 从一个切换到另一个几乎不花多少时间.
在这种情况下, star尤为重要, 这意味着有多少人帮着一起踩雷, 我觉得用一个大而全的框架不如用小而精, 所有的三方库都用star最多的pkg比一个大全是不是更加可靠一些?
#1
更多评论
我之前是做Java程序的,在接触Go以后,一开始写一些小工具(处理一些简单问题,把go当成python来用,python又是一个带运行时的脚本语言,不会发布exe), 后来想着能否做web服务的开发,接触了beego,感觉不适合,后来接触到GoFrame ,发现它封装了很多都是我想要的功能,不需要去找第三方库,也许有更好的第三方库,但要直接使用的话,需要一些学习成本。比如 gin+gorm 都是star数量很多的,这两个项目组合使用的也不在少数,首先需要至少学习两个库,还有把他们结合,需要用到一个读取配置文件的库,还需要一个日志库,对于java转go的程序员来说,需要学的东西太多了,goframe不仅仅包含这几个功能,还有很多常用的功能,框架里啥都有。
对于其他语言转学go的程序或者初学者来说,GoFrame是一个非常优秀的框架。
对于可以随意使用各种小而精三方库的程序员来说,挤需体验三番钟,里造会干我一样,爱象介款框架:https://goframe.org
#2
我主业也是java, 业余时间写go, 说实话, 我觉得学习框架的成本并不高, 比如我用gin替换iris分分钟就弄完了, 没啥后遗症.他们都长得一样大同小异.至于你提到的其他的三方库日志库ORM库啥的, 也很容易使用啊, 没啥学习成本的.你安利的goframe应该也很不错, 不过没有特殊的原因暂时不打算尝试了.对于初学者, 我觉得打好基础用啥框架都一样.替换也是分分钟的事情.不要被固定的框架绑架了影响对go语言自身的学习和探索就好了.
#3