zl程序教程

您现在的位置是:首页 >  其他

当前栏目

「Go工具箱」推荐一个变量调试神器:go-spew

2023-02-26 09:48:45 时间

大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。同时了解其底层的实现原理,以便更深入地了解Go语言。

今天给大家推荐的是一个可以将变量以一种非常友好的方式输出其完整的数据结构信息的工具: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

---特别推荐---

特别推荐:一个专注go项目实战、项目中踩坑经验及避坑指南、各种好玩的go工具的公众号,「Go学堂」,专注实用性,非常值得大家关注。点击下方公众号卡片,直接关注。关注送《100个go常见的错误》pdf文档。