GF(Go Frame)
是一款模块化、高性能、生产级的 Go 基础开发框架。实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、对象池、配置管理、资源管理、数据校验、数据编码、定时任务、数据库 ORM 、TCP/UDP 组件、进程管理 /通信等等。并提供了 Web 服务开发的系列核心组件,如:Router
、Cookie
、Session
、Middleware
、服务注册、模板引擎等等,支持热重启、热更新、域名绑定、TLS/HTTPS
、Rewrite
等特性。
OSC 最佳开源项目评选开始了,如果您喜欢GoFrame
,欢迎为GoFrame
投上您宝贵的一票🙏 https://www.oschina.net/p/goframe
由于GoFrame
是模块化设计,因此每个版本的更新记录都会以模块的形式进行介绍。
重要更新:
json
操作从标准库替换为json-iterator/go
,提高操作效率。Redis
适配器支持。其中内存适配器默认核心模块提供,Redis
适配器由社区模块提供: https://goframe.org/os/gcache/adapterWeb Server
增加所有配置项示例: https://goframe.org/net/ghttp/config/exampleORM
新增基于Redis
的SQL
缓存适配器: https://goframe.org/database/gdb/model/cacheORM
新增模型关联实验特性: https://goframe.org/database/gdb/model/associationORM
改进时间自动更新特性增加自定义时间字段: https://goframe.org/database/gdb/model/auto-timeCurrent
及Next
方法: https://goframe.org/errors/gerror/indexnet
ghttp
Client
GetVar/PutVar/PostVar
等*Var
请求方法,用于发起HTTP
请求获取内容之后直接返回泛型对象,方便类型转换,特别是针对于返回XML/JSON
的结果处理将会更加简便: https://goframe.org/net/ghttp/client/demo/indexSetProxy/Proxy
方法,用于设置客户端代理,支持HTTP/Socket5
代理类型: https://goframe.org/net/ghttp/client/demo/proxySetRedirectLimit/RedirectLimit
方法,用于设置页面跳转数量限制。Request
ParseQuery
, ParseForm
方法,用于解析指定类型的参数,并绑定到给定的对象。GetHeader
方法,用于获取指定Header
参数。GetRemoteIp
方法,用于获取请求客户端 IP 。在 IP 白名单限制时应当使用GetRemoteIp
而不是GetClientIp
进行判断,后者可以通过Header
伪造。ReloadParam
方法,往往用在中间件处理中,当中间件修改了请求参数,需要通过调用该方法重新解析一下请求参数。GetRouterMap
方法,用于获得所有的路由参数返回为map
。Response
Output
方法名称改为Flush
,用于将缓冲区的数据写入到客户端数据流中。Server
Server
增加所有配置项示例: https://goframe.org/net/ghttp/config/exampleSessionCookieOutput
配置,用于控制是否输出SessionId
到Cookie
中,默认为开启。URI
带有重复的/
符号的支持。Pprof
功能路由支持Domain
绑定。Cookie
SetHttpCookie
方法,用于根据标准库http.Cookie
对象设置Cookie
。database
gdb
Redis
的SQL
缓存适配器: https://goframe.org/database/gdb/model/cacheDB.HasTable
方法,用于判断是否当前数据库存在指定数据表。Model.HasField
方法,用于判断是否当前数据表存在指定字段。Model.ScanList
方法,用于智能地将当前struct
/slice
绑定到指定的list
对应属性上。Result.MapKeyValue
方法,用于将当前Result
转换为map[string]Value
类型。Result.IsEmpty/Len/Size/ScanList
方法。ListItemValues
及ListItemValuesUnique
方法,用于自动获取list
中指定名称的键值或属性值,构成slice
返回。SQL
日志内容增加分组名称打印。DataToMapDeep
方法。gredis
TLS
特性支持,并支持配置文件配置,https://goframe.org/database/gredis/configcontainer
gvar
Scan
及ScanDeep
方法,用于struct
/slice
自动识别转换。ListItemValues
及ListItemValuesUnique
方法,用于自动获取list
中指定名称的键值或属性值,构成slice
返回。MapStrAny
接口实现方法。os
gcache
GetVar
方法,用于获取缓存数据并返回为泛型对象。Update
方法,用于仅修改缓存数值,不修改缓存过期时间。UpdateExpire
方法,用于仅修改缓存过期时间,不修改缓存数值。Redis
适配器支持。其中内存适配器默认核心模块提供,Redis
适配器由社区模块提供: https://goframe.org/os/gcache/adaptererror
参数返回,升级时请注意查看。编译时将不会通过。gfile
ScanDirFileFunc
方法,用于自定义函数处理的递归目录文件遍历。Scan*
方法,增加递归层级限制,默认层级限制为100000
.gfsnotify
Watcher
对象创建,调整为运行时按需创建,并且增加了并发安全控制。grpool
AddWithRecover
方法,用于添加异步任务时给定一个recover
处理方法,当任务panic
时交由该recover
方法处理,防止异步任务panic
引起整个进程崩溃。这里解决的痛点是
recover
只能捕获到当前goroutine
的panic
,因此只能在创建异步任务的时候指定recover
处理方法。
gtime
ParseDuration
方法,增加了对时间单位d
的支持,表示天。New
方法,支持通过字符串、时间戳、time.Time
对象创建gtime.Time
对象,https://goframe.org/os/gtime/timeAdd/AddStr/ToLocation/ToZone/UTCLocal/AddDate/Truncate/Round
方法,这些方法调用时,不再修改当前对象本身,而是创建并返回一个新的gtine.Time
对象,以便保证和标准库time.Time
的逻辑一致,防止混淆。gtimer
Reset
方法,用于重置定时任务的计时。gfcache
debug
gdebug
GoroutineId
方法,用于获取当前执行的goroutine id
,仅作调试使用。encoding
gjson
GetScan/GetScanDeep
方法。ToScan/ToScanDeep
方法。LoadContentType
方法,用于根据指定类型的内容创建Json
操作对象。IsValidDataType
方法,用于判断给定的数据类型是否支持解析。gcompress
GzipFile/UnGzipFile
基于gzip
压缩算法的文件压缩 /解压。i18n
gi18n
TranslateFormat/TranslateFormatLang/Tf/Tfl
方法: https://goframe.org/i18n/gi18n/indextext
gstr
SnakeFirstUpperCase
方法,用于在字母大写前增加连接符,并不会处理数字,例如:SnakeFirstUpperCase("RGBCodeMd5")
将会返回rgb_code_md5
。util
gconv
Scan/ScanDeep
方法,用于自动识别转换Struct/[]Struct
。MapDeep
方法的层级递归处理。gutil
ListItemValues
及ListItemValuesUnique
方法,用于自动获取list
中指定名称的键值或属性值,构成slice
返回。ItemValue
方法,用于获取指定map/*map/struct/*struct
类型的键值 /属性值。MapOmitEmpty
方法,用于过滤map
中的空值。SliceDelete
方法,用于数组项删除。Try
方法,通过闭包执行给定的方法,如果方法产生panic
则该方法返回error
,否则返回nil
。TryCatch(try func(), catch ...func(exception interface{}))
为TryCatch(try func(), catch ...func(exception error))
gvalid
error
gerror
Current
方法,用于获取当前错误层级的error
接口对象。Next
方法,用于获取层级错误的下一级错误error
接口对象。当下一层级不存在时,返回nil
。garray
模块的Unique
方法问题。glog
中定时器懒初始化时的goroutine
泄露问题。gstr
中名称Case
转换相关方法在名称中带有数字+特殊字符时的名称转换问题。ghttp
模块中的CORS
跨域设置Header
细节问题。 1
yrj 2020-10-27 03:48:07 +08:00 via iPad
支持一下封装狂魔的国产框架,不过我选了 fiber
|
2
wzw 2020-10-27 04:53:47 +08:00 via iPhone
超级好用
|
3
justin2018 2020-10-27 05:19:19 +08:00
支持一下
|
4
musi 2020-10-27 06:53:00 +08:00 via iPhone
已 star,最近刚好在学 go,可以试一下
|
5
sunorg 2020-10-27 06:53:56 +08:00 via Android
不错不错,正好新项目就用他。
|
6
lidongyo 2020-10-27 08:55:34 +08:00
看着听不错的,顶一顶
|
8
danbai 2020-10-27 09:10:06 +08:00 via Android
特别喜欢这个框架。。
|
9
lower 2020-10-27 09:22:44 +08:00
新注册用户 3 天后才能投票……
|
10
reus 2020-10-27 09:57:08 +08:00
额外的封装都是多余
|
11
beidounanxizi 2020-10-27 10:22:43 +08:00
多少有点民科
|
12
Hanggi 2020-10-27 10:24:45 +08:00
能问下,为什么不放到 github 上吗?
|
13
sunmoon1983 2020-10-27 10:47:32 +08:00
|
14
eudore 2020-10-27 10:55:17 +08:00
单元测试先到 95%以上在说,都这么多年了还才 69%,有没有 race 测试都不知道。测试覆盖率报告: https://codecov.io/gh/gogf/gf/branch/master
以前看到的 gmap 组件的软文(18 年),单线程去对比测试 sync.Map ,得出的比 sync.Map 块一倍性能结果 2020 年看还在,这样低价错误严重怀疑水平。 代码质量报告: https://goreportcard.com/report/github.com/gogf/gf 69%叫做高覆盖率,别人 98%、100%叫啥,goreportcard 的检查问题一堆也叫高代码质量,基本的 gofmt 都没有,注水真严重,多的就没看了。 |
16
lemayi 2020-10-27 11:57:20 +08:00
强烈支持
|
17
labulaka521 2020-10-29 21:27:58 +08:00 via iPhone
@eudore golang 哪些库测试覆盖率在 98 、100,学习学习
|