Go开发者的工具箱:gookit/goutil,900+实用函数汇集
Go标准库以精简著称,但日常开发中经常缺一些组合操作:数组差集交集、文件快捷读写、带调用栈的错误处理。这些功能标准库不提供,开发者要么自己造轮子,要么引入多个零散依赖。gookit/goutil 把这些操作集中到一个库中,共计 900 多个函数,累积了 2.3k Star。


goutil 覆盖了 Go 开发的常见基础操作,按功能划分为约二十个子包,每个子包独立、零外部依赖,按需导入即可。
变量打印:dump
Go标准库的 fmt.Println 打印嵌套结构体或切片时,输出挤在一行。dump 子包提供了类似 PHP var_dump 的变量打印功能,自动展开嵌套结构、标注类型和长度,同时显示调用位置:
go
dump.P(
23,
[]string{"ab", "cd"},
map[string]interface{}{
"key": "val", "sub": map[string]string{"k": "v"},
},
)
输出按层级缩进,每个元素占据独立一行,嵌套再深也能看清结构。
错误处理:errorx
Go 1.13 引入了 %w 和 errors.Is/As 来做错误包裹与判断。errorx 在此基础上增加了调用栈。用 errorx.New 替代 errors.New,或 errorx.Wrap 包裹已有 error,打印时自动附带从错误创建位置到当前调用链的完整堆栈:
go
err := errorx.New("the error message")
fmt.Println(err)
// 输出 error message,同时附带 STACK 调用链
对于多层嵌套调用的项目,比原始 error 多了定位来源的直接信息。
时间处理:timex
timex 是对 time.Time 的增强封装。除了 DateFormat 支持 Y-m-d H:i:s 模板语法,还内置了常用边界方法:DayStart() 获取当天零点、DayEnd() 获取当天最后一刻、NowAddDay() 快速计算偏移日期。时间差的人性化显示也直接提供:
go
now := timex.Now()
fmt.Println(now.DayStart())
fmt.Println(now.DateFormat("Y-m-d H:I:S"))
其他子包速览
- arrutil:数组差集、交集、并集、过滤、映射、去重、随机取值
- strutil:字符串检查、转换、编码、截取、格式化
- fsutil:文件读写、目录遍历、路径查找、MIME检测、ZIP解压
- maputil :深度取值
DeepGet、Map合并、扁平化、与数组互转 - mathutil:数值范围判断、Min/Max、类型安全转换(Int/Int64/Uint,均带错误返回)
- jsonutil :JSON编解码、美化输出、带注释JSON的
StripComments - cliutil:终端输入读取(含密码输入)、命令行解析、命令执行
- envutil:环境变量读取、系统类型判断(IsWin/IsMac/IsLinux)、终端色彩支持检测
- cflag :对
flag.FlagSet的增强封装,支持快捷参数映射、枚举选项、KV参数
全部子包合计超过 900 个函数,覆盖了 Go 开发中需要反复编写的工具代码。
安装使用
shell
go get github.com/gookit/goutil
根包的函数可以直接调用:
go
import "github.com/gookit/goutil"
goutil.IsEmpty(nil) // true
goutil.String(23) // "23"
goutil.Int("-2") // 2
goutil.Contains("abc", "a") // true
各子包独立导入,互不耦合,不会引入不需要的代码。
goutil 定位是"Go日常开发的补齐层"。它不是框架,不规定项目结构,每个子包都是独立可用的工具集。对于不想在每个项目中反复实现 Contains、Reverse、DeepGet 这类函数的 Go 开发者来说,goutil 提供了一个经过验证的集中方案。