推荐一个变量调试神器:go-spew
今天给大家推荐的是一个可以将变量以一种非常友好的方式输出其完整的数据结构信息的工具:go-spew。
该包经过了全面的测试,测试覆盖率为100%。支持各种自定义配置,非常方便,可以有效提升我们日常开发的效率。下面是该包的基础档案:
go-spew小档案 | |||
---|---|---|---|
star | 5.3k | used by | 311k+ |
contributors | 20 | 工具分类 | 效率 |
功能简介 | 以一种更友好的方式输出输出变量的完整的数据结构信息 |
先来看下基础使用及其效果,以下有一个指针类型的切片,分别通过go-spew和fmt.Printf格式化输出:
type Project struct {
Name string
}
func main() {
f := []*Project{
&Project{Name: "张三"},
&Project{Name: "李四"},
}
spew.Config.Indent = "\t"
spew.Dump(f)
fmt.Printf("f:%+v\n", f)
}
spew包会输出格式化、详细的数据结构信息:
([]*igospew.Project) (len=2 cap=2) {
(*igospew.Project)(0xc00009ae10)({
Name: (string) (len=6) "张三",
CreateTime: (time.Time) 0001-01-01 00:00:00 +0000 UTC,
Addr: (*igospew.Address)(<nil>)
}),
(*igospew.Project)(0xc00009ae40)({
Name: (string) (len=6) "李四",
CreateTime: (time.Time) 0001-01-01 00:00:00 +0000 UTC,
Addr: (*igospew.Address)(<nil>)
})
}
fmt.Printf的输出只有变量的地址,而没有详细的内容:
f:[0xc00009ae10 0xc00009ae40]
该包对于 map、slice、嵌套 struct 等类型的数据都可以友好地展示出来。包括长度、字段类型、字段值、指针值以及指针指向的数据等。
实现原理:该包本质上还是利用了reflect反射功能。通过reflect.ValueOf函数获取变量的值,然后再根据该值的Kind函数来判断其具体的数据类型,然后根据数据类型对值进行转换输出。同时再配合换行和缩进来实现格式化的输出。
更多功能
go-spew有三个 Dump 系列函数:
-
Dump() 标准输出到os.Stdout
-
Fdump() 允许输出到自定义io.Writer
-
Sdump() 输出的结果作为字符串返回
此外,还有 Printf、 Fprintf、Sprintf 几个函数来支持定制输出风格。用法与 fmt 的函数相似。
自定义配置
go-spew 支持一些自定义配置,可以通过 spew.Config 修改。
一些常用配置如下:
-
Indent 修改分隔符
-
MaxDepth 控制遍历最大深度
-
DisablePointerAddresses 控制是否打印指针类型数据地址
更多项目详情请查看如下链接。
开源项目地址:https://github.com/davecgh/go-spew
开源项目作者:Dave Collins