GoFrame v1.12 发布,数据库驱动开发、日志滚动切分等等新特性 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
johng
V2EX    Go 编程语言

GoFrame v1.12 发布,数据库驱动开发、日志滚动切分等等新特性

  •  1
     
  •   johng 2020-03-31 00:13:37 +08:00 3263 次点击
    这是一个创建于 2107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好啊!久等啦!

    由于自从上次版本的发布以来,越来越多小伙伴加入了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

    1. gen model命令新增对pgsql/mssql/sqlite/oracle的模型生成支持。
    2. gen model命令生成模型新增公开包变量Columns用于获得表的字段名称。

    net

    1. ghttp

    database

    1. gdb

    2. gredis

      • 增加 /修改默认的数据库连接池参数:MaxIdle=10, IdleTimeout=10s, MaxCOnnLifetime=30s, Wait=true
      • 完善单元测试。

    container

    1. 所有容器对象新增UnmarshalValue(interface{}) error接口方法实现,用于gconv转换时根据任意类型变量创建 /设置对象内容,GF框架的所有容器对象均实现了该接口。

    2. garray

      • 新增RemoveValue方法,用于根据数值检索并删除元素项。
      • 新增FilterNil方法,用于遍历并删除数组中的nil元素项。
      • 新增FilterEmpty方法,用于遍历并删除数组中的空值元素项,空值包括:0, nil, false, "", len(slice/map/chan) == 0
      • 改进Set/Fill/InsertBefore/InsertAfter方法严谨性,将原有的链式操作返回值对象修改为error返回值。
      • 改进Get/Remove/PopRand/PopLeft/PopRight/Rand方法严谨性,增加foundbool返回值,标识当前方法是否有数据返回,当空数组或者操作越界时found返回值为false
      • 改变Rands方法原有逻辑,保证按照给定大小返回随机数组。
      • 完善单元测试。
    3. gpool

      • 调整缓存池过期时间参数类型,旧版本为int类型表示毫秒,新版本为time.Duration类型使得时间控制更灵活。
      • 内部代码优化,性能改进。
      • 完善单元测试。
      • 完善注释。

    os

    1. glog

    2. gres

      1. 改进资源内容编码设计,采用新的压缩算法,减少资源文件大小,例如原本15MB的网站静态资源文件(css/js/html等),资源文件打包后约为4MB左右: https://goframe.org/os/gres/index
      2. 注意:该改进与旧版本无法兼容,需要重新打包原有的资源文件。
      3. 完善单元测试。
    3. gcfg

      • 去掉配置对象属性的原子并发安全控制,改为普通变量类型。由于配置管理是最常用模块之一,因此确保高效的设计及方法实现。
      • 单例对象做较大调整:为方便多文件场景下的配置文件调用,简便使用并提高开发效率,因此当给定的单例名称对应的toml配置文件在配置目录中存在时,将自动设置该单例对象的默认配置文件为该文件。例如:g.Cfg("redis")获取到的单例对象将会默认去检索并设置默认的配置文件为redis.toml,当该文件不存在时,则使用默认的配置文件(config.toml): https://goframe.org/net/ghttp/config
      • 完善单元测试。
    4. gview

    5. gfile

      • 改进SelfPath获取当前执行文件路径方法,提高执行效率。
      • 改进Join文件路径连接方法,防止多余的路径连接符号。
      • 改建GetContents文件内容获取方法执行效率,降低内存占用。
      • 新增StrToSize方法,用于将大小字符串转换为字节数字,大小字符串例如10m, 5KB, 1.25Gib等。
      • 新增ReadLines/ReadByteLines方法,用于按行读取指定文件内容,并给定读取回调函数。
      • 完善单元测试。
    6. gtime

      • 改进gtime.Time对象实现,统一字符串打印时间格式为Y-m-d H:i:s,如:2020-01-01 12:00:00
    7. gcmd

      • 命令行解析方法增加strict参数,用于设置当前解析是否严格解析,严格解析下如果给定了非法的选项,将会停止解析并返回错误。默认情况下为非严格解析。
    8. genv

      • 改进Remove删除环境变量键值对方法,增加对多个键值对环境变量的删除。
    9. gfpool

      • 改进代码实现,提高效率。
      • 完善单元测试。
    10. gfsnotify

      • 改进包初始化方法,当系统原因引起默认Watcher对象创建失败时,直接panic
    11. gproc

      • 改进SearchBinaryPath方法。
      • 改进Process.Kill方法在windows*niux平台下不同表现的处理。

    encoding

    1. gjson

    frame

    1. g
      • 新增IsNil方法,用于判断当前给定的变量是否为nil,该方法有可能会使用到反射来实现判断。
      • 新增IsEmpty方法,用于判断当前给定的变量是否为,该方法优先使用断言判断但有可能会使用到反射来实现判断。空值包括:0, nil, false, "", len(slice/map/chan) == 0
      • 标记废弃SetServerGraceful方法,转而统一交给Server的配置来管理。
    2. gins
      • 改进代码结构,方便维护。
      • 改进、完善单元测试。
    3. gmvc
      • 新增M类型,为*gdb.Model的别名简称,用于工具链自动生成模型中的M属性。

    text

    1. gstr
      • 新增HasPrefix/HasSuffix方法。
      • 新增OctStr方法,用于将八进制字符串转换为其对应的unicode字符串,例如转换为中文。常用于gRPC底层通信编码中。
      • 完善单元测试。

    debug

    1. gdebug
      • 改进代码结构,方便维护。
      • 新增TestDataPath方法,用于当前包单元测试中获得当前包中testdata目录的绝对路径。

    util

    1. gconv

      • 改进String字符串转换方法,增加对time.Time/*time.Time/gtime.Time类型的内置支持。
      • 改进Map/Struct转换方法,增加对一些特殊场景的细节处理。经过大规模的使用,大量的反馈改进,不断完善了细节。
      • 改进Struct转换方法,增加对UnmarshalValue(interface{}) error接口的支持。
      • 完善单元测试。
    2. grand

      • 注意:不兼容调整,原有的Str方法更名为S方法,用以获取指定长度的随机字符串、数字,并增加symbol参数,指定是否可以随机返回特殊可见字符。
      • 新增Str方法,用于从指定的字符串字符中随机获取指定长度的字符串。该方法同时支持unicode字符串,例如:中文: https://goframe.org/util/grand/index
      • 新增Symbols方法,用于随机返回指定场孤独的特殊可见字符: https://goframe.org/util/grand/index
      • 完善单元测试。
    3. gvalid

      • 长度校验规则增加对unicode字符串的支持,例如:中文。

    Bug Fix

    1. 修复Server的视图对象配置失效问题。
    2. 修复Server中间件在中间件panic情况下,忽略Middleware.Next方法控制,导致鉴权中间件失效的问题。
    3. 修复gudp.Server在请求包大小超过64bytes时的断包问题,并调整默认缓冲区大小为1024byte,开发者可自定义缓冲区大小。
    4. 修复gfile.MTimeMillisecond方法返回错误的文件修改毫秒时间戳。
    5. 修复gconv.Int64对负数转换的支持。
    6. 其他一些修复。
    7. 详见: https://github.com/gogf/gf/issues?q=label%3Abug
    16 条回复    2020-05-02 18:11:05 +08:00
    iBenlim
        1
    iBenlim  
       2020-03-31 08:07:10 +08:00 via iPhone
    666
    loading
        2
    loading  
       2020-03-31 10:13:17 +08:00
    牛逼,准备用一下。
    keepfun
        3
    keepfun  
       2020-03-31 15:52:03 +08:00
    厉害的 golang 人
    guonaihong
        4
    guonaihong  
       2020-03-31 18:24:31 +08:00
    维护这么多的 topic,如何把每个 topic 做到世界第一呢?
    guonaihong
        5
    guonaihong  
       2020-03-31 18:37:56 +08:00
    先为楼主的思路说声佩服。上面说的有点歧义。原本想说,楼主维护的代码特别多,这里涉及很多 topic,每个 topic 都可以开一个单独的开源项目维护。比如 orm,比如 web 框架,GoFrame 里面的 web 框架要和 gin 竞争,orm 要和 xorm 或者 gorm 竞争。从时间和精力来看,这有点难啊,到不是说楼主不牛。只是从时间和精力来看,这个火力有点不够聚焦。有信心超过 gin 和 xorm 吗?而且 gin 和 xorm,orm 聚焦的维护人员还特别多。你说气不气。。。
    http client 要和 gout 竞争,关键还有 1w 行思路没有输出(让你措不及防的广告)
    johng
        6
    johng  
    OP
       2020-03-31 21:48:15 +08:00
    @guonaihong
    1. 首先,你不要想着和谁去争第一,你的初衷是要满足需求,去解决痛点。你能解决问题,并且能解决好问题,才能被接受。
    2. 其次,你不要想着去解决所有问题,你要去解决共性、通用的问题,或者项目开发中最关键性的问题,提供基础的解决方式。
    3. 再者,并不是说单纯做一个 topic 就一定能做得更好,起决定因素的往往在于做事情的人,人的技术技能、知识经验、精神态度往往都是在解决共性问题时比较重要的点。
    4. 最后,开源项目,要持之以恒,要不断迭代更新,这才是所有点中最耗费精力的点,也是最关键的点。

    你提到的 gin 、xorm 、gorm 都是很不错的开源项目,在 gf 框架里面也算是核心模块,也是业务项目开发的基础。gf 的许多模块在不断的迭代更新中,至今做得非常的出色,outstading 。
    guonaihong
        7
    guonaihong  
       2020-03-31 23:23:05 +08:00
    首先感谢 @johng 的回答,好像了解了一些。我相信你这么给力的开发人员,胸心应该是非常开阔的。索性问个犀利点的问题。
    go 世界的著名开发人员 dv(简写)提倡过,一个开源的 go 库,最好只做一件事,我深度思考过这个观点,最后得到这个观点言之有理。因为只做一个 topic,可以很容易地做到极致,做到极致的库是我优先考虑的重要考量,所谓极致是性能第一,API 简洁度第一,测试覆盖度第一,你是怎么看待这个观点的? GoFrame 很直观不是按这种思路做的。
    johng
        8
    johng  
    OP
       2020-04-01 11:12:33 +08:00
    @guonaihong 你的继续提问,表示你对 GF 比较感兴趣,我也感谢你的支持,以及礼节。

    你说的 dv 应该是指的 Dave 对吧,Dave 的 github: https://github.com/davecheney?tab=repositories 里面有很多不错的开源项目,还不包括工作上未开源的作品,流弊的开发人员能够创造的价值比你我能够想到的可能更多。能不能把事情做好,并不是在于你把库放一个地方还是多个地方。所谓的只做一个库,只做一个 topic 就一定能做到"第一"或者"极致"的想法往往是一厢情愿。不要急着飞,落地下来好好使用使用、对比对比,选个合适的、顺手的,如果没有达到自己"极致"的目标,可以尝试着自己去实现。

    其实你的问题,也是部分小伙伴在接触 GF 之前,也会同样抱有的疑问。我正面回答你的问题,猜测下面可能是你真正想要的答案:

    1. GoFrame 的模块看起来多,但是都是耦合性低的基础模块,所谓"基础设施"、"基础框架"就是这么来的。基础模块的研发,逻辑简单、代码量少、维护成本低,投入产出比最大,往往投入是短期的,收益却是长期的。

    2. GoFrame 的模块主要解决了目前 Golang 在开发项目的几大比较共性的问题:有无的问题、易用的问题、性能的问题、工程化的问题。GF 在去年中旬的时候就已经完成的基础模块的开发工作,新版本的工作主要是根据用户反馈不断迭代完善框架模块功能、细节、易用和性能,并推进社区的活跃性,推进社区参与框架完善以及生态建设。

    3. GoFrame 的模块主要分为两类:基础模块和社区模块。基础模块由 gf 项目管理和发布,是框架的核心组成部分,保证轻量级和高质量。社区模块是在 github.com/gogf 空间下管理的其他模块,由社区提供,并选择入库,作为框架的扩展。

    4. GoFrame 可以把每个基础模块做到"极致"。
    guonaihong
        9
    guonaihong  
       2020-04-01 11:54:52 +08:00
    @johng hi,johng 你的回答方式让我有点想挠挠头发,没有正面回答我的问题。好的谈话方式可以像写作文,有层次,有腹稿,有头尾。对了,我对 gf 的兴趣目前在于,想了解做这个项目的出发点,我看到的 github 大多数的项目都是解决一个 topic 。很少看到"非极致项目的联合松散联合体"。

    我想升级下问题。可以吗?
    我上一个问题其实想问,gf 里面各个模块单独拿出来,和目前已经占据 top 1 的项目比没有任何优势。那做这个事的意义,那我换个问题。下面是最后一次问了

    跟 gin 项目相比,gf 里面集成 http router 的意义在于?
    跟 xorm 和 gorm 项目相比,gf 里面集成 orm 的意义在于?
    johng
        10
    johng  
    OP
       2020-04-01 12:33:48 +08:00
    @guonaihong
    > 我上一个问题其实想问,gf 里面各个模块单独拿出来,和目前已经占据 top 1 的项目比没有任何优势。那做这个事的意义,那我换个问题。下面是最后一次问了
    ----------------------------------------------------------------------------------
    不要先入为主,先了解下 gf,看看文档和源码,了解一下再下论断。
    guonaihong
        11
    guonaihong  
       2020-04-02 13:08:40 +08:00
    打住,就这样吧,再聊下去可能会意气之争。你说的,我会看下。
    iliul
        12
    iliul  
       2020-04-02 19:07:11 +08:00
    关注一波
    wzw
        13
    wzw  
       2020-04-19 09:32:40 +08:00
    @johng #10 想问问 ghttp 是否准备出 auto api doc 的这样的计划 (类似 FastAPI)
    johng
        14
    johng  
    OP
       2020-04-24 15:33:18 +08:00
    @wzw 目前已经支持 swagger
    wzw
        15
    wzw  
       2020-04-27 08:13:59 +08:00
    @johng #14 是不是文档还没有更新到 swagger
    wzw
        16
    wzw  
       2020-05-02 18:11:05 +08:00
    @johng #14 已经看到 demo 和 插件. 已用上,谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3341 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 11:26 PVG 19:26 LAX 03:26 JFK 06:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86