<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3643字,需瀏覽 8分鐘

           ·

          2022-06-27 23:07

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

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

          go-spew

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

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

          對(duì)于復(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)
          }

          可以看到,對(duì)于 map、slice、嵌套 struct 等類型的數(shù)據(jù)都可以友好地展示出來(lái)。包括長(zhǎng)度、字段類型、字段值、指針值以及指針指向的數(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)
          })

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

          Dump系列函數(shù)

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

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

          自定義配置

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

          • MaxDepth 控制遍歷最大深度

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

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

          小結(jié)

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

          References

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

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



          往期推薦



          今晚,即將迎來(lái)新一位嘉賓··· 


          簡(jiǎn)單好用的緩存庫(kù) gcache


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

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

          分享、在看與點(diǎn)贊,至少我要擁有一個(gè)叭~

          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产91女技师一区二区三区 | 色综合五月天 | 国产日韩一级片 | 日韩一区二区黄片视频在线看 | 风流老熟女一区二区三区 |