0%

spew - 更直观地打印变量

除了 spew,我们当然也可以直接选择通过 IDE 的 debug 功能来调试。

spew

go-spew 是一个帮助开发者更直观地打印变量的工具.

通过 fmt.Print 系列方法打印变量或者结构体、数组的时候,我们看到的信息其实是很不直观的,而借助 go-spew 可以非常直观地看到打印变量的信息,比如类型、结构体字段等。

安装

1
go get -u github.com/davecgh/go-spew/spew

示例

  1. 打印基础类型
1
2
3
a := 1
fmt.Println(a)
spew.Dump(a)

输出:

1
2
1
(int) 1 // 比 fmt 的输出多了类型信息
  1. 打印结构体
1
2
3
4
5
6
p := Person{
Name: "spew",
age: 23,
}
fmt.Println(p)
spew.Dump(p)

输出:

1
2
3
4
5
{spew 23}
(main.Person) { // 比 fmt 的输出多了类型、字段名、字段类型、字符串类型的长度等信息,另外还有缩进
Name: (string) (len=4) "spew",
age: (int) 23
}
  1. 打印切片
1
2
3
arr := [...]int{1, 2, 3}
fmt.Println(arr)
spew.Dump(arr)

输出:

1
2
3
4
5
6
[1 2 3]
([3]int) (len=3 cap=3) { // 比 fmt 的输出多了长度、类型、容量等信息,而且输出的格式是带缩进的
(int) 1,
(int) 2,
(int) 3
}
  1. 打印到 Writer

someWriter 是任何实现了 io.Writer 的对象。

1
spew.Fdump(someWriter, myVar1, myVar2, ...)
  1. 获取格式化的字符串

下面这个 Sdump 会返回一个字符串而不是直接输出。

1
str := spew.Sdump(myVar1, myVar2, ...)

调试 Web 应用

使用 Sdump 来获取结构体的所有详细信息。

1
2
3
4
5
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:])
fmt.Fprintf(w, "<!--\n" + html.EscapeString(spew.Sdump(w)) + "\n-->")
}