除了 spew,我们当然也可以直接选择通过 IDE 的 debug 功能来调试。
spew
go-spew 是一个帮助开发者更直观地打印变量的工具.
通过 fmt.Print
系列方法打印变量或者结构体、数组的时候,我们看到的信息其实是很不直观的,而借助 go-spew 可以非常直观地看到打印变量的信息,比如类型、结构体字段等。
安装
go get -u github.com/davecgh/go-spew/spew
示例
- 打印基础类型
a := 1
fmt.Println(a)
spew.Dump(a)
输出:
1
(int) 1 // 比 fmt 的输出多了类型信息
- 打印结构体
p := Person{Name: "spew",age: 23,
}
fmt.Println(p)
spew.Dump(p)
输出:
{spew 23}
(main.Person) { // 比 fmt 的输出多了类型、字段名、字段类型、字符串类型的长度等信息,另外还有缩进Name: (string) (len=4) "spew",age: (int) 23
}
- 打印切片
arr := [...]int{1, 2, 3}
fmt.Println(arr)
spew.Dump(arr)
输出:
[1 2 3]
([3]int) (len=3 cap=3) { // 比 fmt 的输出多了长度、类型、容量等信息,而且输出的格式是带缩进的(int) 1,(int) 2,(int) 3
}
- 打印到
Writer
someWriter
是任何实现了 io.Writer
的对象。
spew.Fdump(someWriter, myVar1, myVar2, ...)
- 获取格式化的字符串
下面这个 Sdump
会返回一个字符串而不是直接输出。
str := spew.Sdump(myVar1, myVar2, ...)
调试 Web 应用
使用 Sdump
来获取结构体的所有详细信息。
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-->")
}