调试利器 go-spew

对于应用的调试,我们经常会使用 fmt.Println来输出关键变量的数据。或者使用 log 库,将数据以 log 的形式输出。对于基础数据类型,上面两种方法都可以比较方便的满足需求。对于一些结构体类型数据通常我们可以先将其序列化后再输出。 如果结构体中包含不可序列化的字段,比如 func 类型,那么序列化就会抛出错误,阻碍调试。 ## go-spew 上面的需求,go-spew 可以完美的帮我们实现。go-spew 可以以一种非常友好的方式输出完整的数据结构信息。如: ``` s := "GoCN" i := 123 spew.Dump(s, i) //----- (string) (len=4) "GoCN" (int) 123 ``` 对于复杂的数据类型: ``` type S struct { S2 *S2 I *int } type S2 struct { Str string } func main() { s := "GoCN" i := 2 f := []float64{1.1, 2.2} m := map[string]int{"a": 1, "b": 2} e := errors.New("new error") ss := S{S2: &S2{Str: "xxx"}, I: &i} spew.Dump(s, i, f, m, e, ss) } //----- (string) (len=4) "GoCN" (int) 2 ([]float64) (len=2 cap=2) { (float64) 1.1, (float64) 2.2 } (map[string]int) (len=2) { (string) (len=1) "a": (int) 1, (string) (len=1) "b": (int) 2 } (*errors.errorString)(0xc000010320)(new error) (main.S) { S2: (*main.S2)(0xc000010330)({ Str: (string) (len=3) "xxx" }), I: (*int)(0xc00001e1f0)(2) } ``` 可以看到,对于 map、slice、嵌套 struct 等类型的数据都可以友好的展示出来。包括长度、字段类型、字段值、指针值以及指针指向的数据等。 ``` u := &url.URL{Scheme: "https", Host: "gocn.vip"} req, err := http.NewRequestWithContext(context.Background(), "GET", u.String(), nil) if err != nil { panic(err) } spew.Dump(req) //----- (*http.Request)(0xc000162000)({ Method: (string) (len=3) "GET", URL: (*url.URL)(0xc000136090)(https://gocn.vip), Proto: (string) (len=8) "HTTP/1.1", ProtoMajor: (int) 1, ProtoMinor: (int) 1, Header: (http.Header) { }, Body: (io.ReadCloser) , GetBody: (func() (io.ReadCloser, error)) , ContentLength: (int64) 0, TransferEncoding: ([]string) , Close: (bool) false, Host: (string) (len=8) "gocn.vip", Form: (url.Values) , PostForm: (url.Values) , MultipartForm: (*multipart.Form)(), Trailer: (http.Header) , RemoteAddr: (string) "", RequestURI: (string) "", TLS: (*tls.ConnectionState)(), Cancel: (<-chan struct {}) , Response: (*http.Response)(), ctx: (*context.emptyCtx)(0xc000020090)(context.Background) }) ``` 上面是一个 http.Request类型的变量,其中包含多种复杂的数据类型,但 go-spew都可以友好的输出出来,非常方便我们调试。 ## Dump系列函数 go-spew有三个 Dump 系列函数: - Dump() 标准输出到os.Stdout - Fdump() 允许输出自定义io.Writer - Sdump() 输出的结果作为字符串返回 此外,还有 Printf、 Fprintf、Sprintf 几个函数来支持定制输出风格。用法与fmt的函数相似。 ## 自定义配置 go-spew 支持一些自定义配置,可以通过spew.Config 修改。 一些常用配置如下: - Indent 修改分隔符 - MaxDepth 控制遍历最大深度 - DisablePointerAddresses 控制是否打印指针类型数据地址 此外还有其他很多配置,大家可以自己测试一下,这里不再举例。 ## 小结 go-spew是一个非常完美的输出Go数据结构的调试工具,并且经过了全面的测试,测试覆盖率为100%。该工具支持各种自定义配置,非常方便,可以较大提升我们日常开发的效率。 #### References [davecgh/go-spew: Implements a deep pretty printer for Go data structures to aid in debugging (github.com)](https://github.com/davecgh/go-spew) [飞雪无情的博客 (flysnow.org)](https://www.flysnow.org/2019/02/03/golang-classic-libs-go-spew.html) ![](https://upload-images.jianshu.io/upload_images/28199768-5b455a2c6a01ecd0.png) 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容