調試利器 go-spew

對于應用的調試,我們經(jīng)常會使用 fmt.Println來輸出關鍵變量的數(shù)據(jù)。或者使用 log 庫,將數(shù)據(jù)以 log 的形式輸出。對于基礎數(shù)據(jù)類型,上面兩種方法都可以比較方便的滿足需求。對于一些結構體類型數(shù)據(jù)通常我們可以先將其序列化后再輸出。 如果結構體中包含不可序列化的字段,比如 func 類型,那么序列化就會拋出錯誤,阻礙調試。 ## go-spew 上面的需求,go-spew 可以完美的幫我們實現(xiàn)。go-spew 可以以一種非常友好的方式輸出完整的數(shù)據(jù)結構信息。如: ``` s := "GoCN" i := 123 spew.Dump(s, i) //----- (string) (len=4) "GoCN" (int) 123 ``` 對于復雜的數(shù)據(jù)類型: ``` 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 等類型的數(shù)據(jù)都可以友好的展示出來。包括長度、字段類型、字段值、指針值以及指針指向的數(shù)據(jù)等。 ``` 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類型的變量,其中包含多種復雜的數(shù)據(jù)類型,但 go-spew都可以友好的輸出出來,非常方便我們調試。 ## Dump系列函數(shù) go-spew有三個 Dump 系列函數(shù): - Dump() 標準輸出到os.Stdout - Fdump() 允許輸出自定義io.Writer - Sdump() 輸出的結果作為字符串返回 此外,還有 Printf、 Fprintf、Sprintf 幾個函數(shù)來支持定制輸出風格。用法與fmt的函數(shù)相似。 ## 自定義配置 go-spew 支持一些自定義配置,可以通過spew.Config 修改。 一些常用配置如下: - Indent 修改分隔符 - MaxDepth 控制遍歷最大深度 - DisablePointerAddresses 控制是否打印指針類型數(shù)據(jù)地址 此外還有其他很多配置,大家可以自己測試一下,這里不再舉例。 ## 小結 go-spew是一個非常完美的輸出Go數(shù)據(jù)結構的調試工具,并且經(jīng)過了全面的測試,測試覆蓋率為100%。該工具支持各種自定義配置,非常方便,可以較大提升我們日常開發(fā)的效率。 #### 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)多平臺發(fā)布
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容