1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        調(diào)試?yán)?go-spew

        共 3643字,需瀏覽 8分鐘

         ·

        2022-06-27 23:07

        對于應(yīng)用的調(diào)試,我們經(jīng)常會使用 fmt.Println來輸出關(guān)鍵變量的數(shù)據(jù)?;蛘呤褂?log 庫,將數(shù)據(jù)以 log 的形式輸出。對于基礎(chǔ)數(shù)據(jù)類型,上面兩種方法都可以比較方便地滿足需求。對于一些結(jié)構(gòu)體類型數(shù)據(jù),通常我們可以先將其序列化后再輸出。

        如果結(jié)構(gòu)體中包含不可序列化的字段,比如 func 類型,那么序列化就會拋出錯誤,阻礙調(diào)試。

        go-spew

        上面的需求,go-spew 可以完美地幫我們實現(xiàn)。go-spew 可以以一種非常友好的方式輸出完整的數(shù)據(jù)結(jié)構(gòu)信息。如:
        s := "GoCN"
        i := 123

        spew.Dump(s, i) 
        //-----
        (string) (len=4) "GoCN"
        (int) 123

        對于復(fù)雜的數(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) <nil>,
         GetBody: (func() (io.ReadCloser, error)) <nil>,
         ContentLength: (int64) 0,
         TransferEncoding: ([]string) <nil>,
         Close: (bool) false,
         Host: (string) (len=8) "gocn.vip",
         Form: (url.Values) <nil>,
         PostForm: (url.Values) <nil>,
         MultipartForm: (*multipart.Form)(<nil>),
         Trailer: (http.Header) <nil>,
         RemoteAddr: (string) "",
         RequestURI: (string) "",
         TLS: (*tls.ConnectionState)(<nil>),
         Cancel: (<-chan struct {}) <nil>,
         Response: (*http.Response)(<nil>),
         ctx: (*context.emptyCtx)(0xc000020090)(context.Background)
        })

        上面是一個 http.Request 類型的變量,其中包含多種復(fù)雜的數(shù)據(jù)類型,但 go-spew 都可以友好地輸出出來,非常方便我們調(diào)試。

        Dump系列函數(shù)

        go-spew有三個 Dump 系列函數(shù):
        • Dump() 標(biāo)準(zhǔn)輸出到os.Stdout
        • Fdump() 允許輸出自定義io.Writer
        • Sdump() 輸出的結(jié)果作為字符串返回

        此外,還有 Printf、 Fprintf、Sprintf 幾個函數(shù)來支持定制輸出風(fēng)格。用法與 fmt 的函數(shù)相似。

        自定義配置

        go-spew 支持一些自定義配置,可以通過 spew.Config 修改。
        一些常用配置如下:
        • Indent 修改分隔符

        • MaxDepth 控制遍歷最大深度

        • DisablePointerAddresses 控制是否打印指針類型數(shù)據(jù)地址

        此外還有其他很多配置,大家可以自己測試一下,這里不再舉例。

        小結(jié)

        go-spew 是一個非常完美的輸出 Go 數(shù)據(jù)結(jié)構(gòu)的調(diào)試工具,并且經(jīng)過了全面的測試,測試覆蓋率為100%。該工具支持各種自定義配置,非常方便,可以有效提升我們?nèi)粘i_發(fā)的效率。

        References

        • davecgh/go-spew: Implements a deep pretty printer for Go data structures to aid in debugging (github.com)

        • 飛雪無情的博客 (flysnow.org)



        往期推薦



        今晚,即將迎來新一位嘉賓··· 


        簡單好用的緩存庫 gcache


        構(gòu)建Go命令行程序工具鏈

        想要了解Go更多內(nèi)容,歡迎掃描下方?? 關(guān)注 公眾號,回復(fù)關(guān)鍵詞 [實戰(zhàn)群]  ,就有機會進群和我們進行交流

        分享、在看與點贊,至少我要擁有一個叭~

        瀏覽 47
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天好逼网AV | 色喵成人AV网站入口 | gay高潮痉挛哭叫 | 国产偷 精品18 | 成年女人毛片 | 韩国三级日本三级 | 熟妇的大黑骚逼浪视频 | 国产精品熟女久久久久久 | 国产一级婬乱A片无码视频黑人 | 我揉着老师白嫩的大乳漫画 |