在 Golang 开发中经常使用 fmt.Println 打印看其值结构。比如:
fmt.Println([]int{1, 2, 3, 4}) // [1 2 3 4]
fmt.Println([]string{"", "", ""}) // [ ]
fmt.Println(map[string]any{
"a": 1,
"b": true,
"c": "",
}) // map[a:1 b:true c:]
标准库打印值是比较简陋的,有时候并不能很直观看出里面结构的值,特别是好几层数据的时候简直没法看。
为了解决这个问题,最近闲下来花了点时间搞了个库:github.com/mengdu/fmtx。 与标准库实现类似,通过反射获取值类型和内部值进行格式化成字符串,我还增加了不同类型值终端颜色输出不同颜色。
功能:
- 更直观打印值
- 支持终端颜色输出(不同类型值颜色区分)
- 支持配置
用法:
安装
go get github.com/mengdu/fmtx
使用
fmtx.Println([]int{1, 2, 3, 4}) // [4/4]int[1, 2, 3, 4]
fmtx.Println([]string{"", "", ""}) // [3/3]string["", "", ""]
fmtx.Println(map[string]any{
"a": 1,
"b": true,
"c": "",
}) // map<string,any>{"a": 1, "b": true, "c": ""}
性能测试:
做了些性能测试,在关闭颜色输出情况下可以优化到跟标准库 fmt.Sprintf("%#v", v) 相当的性能;并且在对象值比较大,数组切片比较长时或者存在递归引用属性时性能表现比标准库好一点。
goos: darwin
goarch: amd64
pkg: github.com/mengdu/fmtx
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkFmtxString-12 1951065 3022 ns/op 1112 B/op 58 allocs/op
BenchmarkFmtxStringDisableColor-12 3332950 1812 ns/op 360 B/op 18 allocs/op
BenchmarkSprintf1-12 3172249 1800 ns/op 272 B/op 10 allocs/op
BenchmarkSprintf2-12 3256015 1987 ns/op 272 B/op 10 allocs/op
BenchmarkSprintf3-12 2901669 2073 ns/op 336 B/op 10 allocs/op
BenchmarkFmtxStringBig-12 97717 66711 ns/op 24240 B/op 1308 allocs/op
BenchmarkFmtxStringDisableColorBig-12 179902 30867 ns/op 7506 B/op 326 allocs/op
BenchmarkSprintfBig1-12 31928 212421 ns/op 83876 B/op 2149 allocs/op
BenchmarkSprintfBig2-12 27352 197811 ns/op 85117 B/op 2205 allocs/op
BenchmarkSprintfBig3-12 27866 206434 ns/op 89727 B/op 2205 allocs/op
PASS
ok github.com/mengdu/fmtx 77.373s
默认情况下会根据输出终端判断是否开启颜色,当然也可以强制设置。
更多例子查看 examples/main.go