fmtx: Golang 更直观的类型值打印

97 阅读2分钟

在 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。 与标准库实现类似,通过反射获取值类型和内部值进行格式化成字符串,我还增加了不同类型值终端颜色输出不同颜色。

功能:

  1. 更直观打印值
  2. 支持终端颜色输出(不同类型值颜色区分)
  3. 支持配置

用法:

安装

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