除了 spew,我们当然也可以直接选择通过 IDE 的 debug 功能来调试。
spew
go-spew
是一个帮助开发者更直观地打印变量的工具.
通过 fmt.Print
系列方法打印变量或者结构体、数组的时候,我们看到的信息其实是很不直观的,而借助
go-spew
可以非常直观地看到打印变量的信息,比如类型、结构体字段等。
安装
1
| go get -u github.com/davecgh/go-spew/spew
|
示例
- 打印基础类型
1 2 3
| a := 1 fmt.Println(a) spew.Dump(a)
|
输出:
1 2
| 1 (int) 1 // 比 fmt 的输出多了类型信息
|
- 打印结构体
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 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 }
|
- 打印到
Writer
someWriter
是任何实现了 io.Writer
的对象。
1
| spew.Fdump(someWriter, myVar1, myVar2, ...)
|
- 获取格式化的字符串
下面这个 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-->") }
|