关于后端:调试利器-gospew

52次阅读

共计 2283 个字符,预计需要花费 6 分钟才能阅读完成。

对于利用的调试,咱们常常会应用 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) <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 类型的变量,其中蕴含多种简单的数据类型,但 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)

飞雪有情的博客 (flysnow.org)

本文由 mdnice 多平台公布

正文完
 0