go-spew調(diào)試?yán)髟斀?/h1>
更新時(shí)間:2022年06月27日 09:40:49 作者:阿馮Bazinga
這篇文章主要介紹了調(diào)試?yán)?go-spew,go-spew?可以以一種非常友好的方式輸出完整的數(shù)據(jù)結(jié)構(gòu)信息,go-spew?支持一些自定義配置,可以通過?spew.Config?修改,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
對(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 支持一些自定義配置,可以通過 spew.Config 修改。
一些常用配置如下:
Indent 修改分隔符
MaxDepth 控制遍歷最大深度
DisablePointerAddresses 控制是否打印指針類型數(shù)據(jù)地址
此外還有其他很多配置,大家可以自己測(cè)試一下,這里不再舉例。
小結(jié)
go-spew 是一個(gè)非常完美的輸出 Go 數(shù)據(jù)結(jié)構(gòu)的調(diào)試工具,并且經(jīng)過了全面的測(cè)試,測(cè)試覆蓋率為100%。該工具支持各種自定義配置,非常方便,可以有效提升我們?nèi)粘i_發(fā)的效率。
References
davecgh/go-spew: Implements a deep pretty printer for Go data structures to aid in debugging (github.com)
到此這篇關(guān)于 go-spew調(diào)試?yán)鞯奈恼戮徒榻B到這了,更多相關(guān) go-spew調(diào)試?yán)鲀?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
GoLang調(diào)用鏈可視化go-callvis使用介紹
與鏈路追蹤(Tracing)不同,Tracing關(guān)注復(fù)雜的分布式環(huán)境中各個(gè)服務(wù)節(jié)點(diǎn)間的調(diào)用關(guān)系,主要用于服務(wù)治理。而我們本次探索的代碼調(diào)用鏈路則是代碼方法級(jí)別的調(diào)用關(guān)系,主要用于代碼設(shè)計(jì) 2023-02-02
-
Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解
限流器是后臺(tái)服務(wù)中十分重要的組件,在實(shí)際的業(yè)務(wù)場(chǎng)景中使用居多。time/rate?包基于令牌桶算法實(shí)現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實(shí)現(xiàn),需要的可以參考一下 2023-04-04
-
golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧 2020-12-12
-
Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫(kù)內(nèi)存實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫(kù)內(nèi)存實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2024-01-01
-
Ubuntu下安裝Go語(yǔ)言開發(fā)環(huán)境及編輯器的相關(guān)配置
這篇文章主要介紹了Ubuntu下安裝Go語(yǔ)言開發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下 2016-02-02
最新評(píng)論
對(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 支持一些自定義配置,可以通過 spew.Config 修改。
一些常用配置如下:
Indent 修改分隔符
MaxDepth 控制遍歷最大深度
DisablePointerAddresses 控制是否打印指針類型數(shù)據(jù)地址
此外還有其他很多配置,大家可以自己測(cè)試一下,這里不再舉例。
小結(jié)
go-spew 是一個(gè)非常完美的輸出 Go 數(shù)據(jù)結(jié)構(gòu)的調(diào)試工具,并且經(jīng)過了全面的測(cè)試,測(cè)試覆蓋率為100%。該工具支持各種自定義配置,非常方便,可以有效提升我們?nèi)粘i_發(fā)的效率。
References
davecgh/go-spew: Implements a deep pretty printer for Go data structures to aid in debugging (github.com)
到此這篇關(guān)于 go-spew調(diào)試?yán)鞯奈恼戮徒榻B到這了,更多相關(guān) go-spew調(diào)試?yán)鲀?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang調(diào)用鏈可視化go-callvis使用介紹
與鏈路追蹤(Tracing)不同,Tracing關(guān)注復(fù)雜的分布式環(huán)境中各個(gè)服務(wù)節(jié)點(diǎn)間的調(diào)用關(guān)系,主要用于服務(wù)治理。而我們本次探索的代碼調(diào)用鏈路則是代碼方法級(jí)別的調(diào)用關(guān)系,主要用于代碼設(shè)計(jì)2023-02-02Golang官方限流器time/rate的使用與實(shí)現(xiàn)詳解
限流器是后臺(tái)服務(wù)中十分重要的組件,在實(shí)際的業(yè)務(wù)場(chǎng)景中使用居多。time/rate?包基于令牌桶算法實(shí)現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實(shí)現(xiàn),需要的可以參考一下2023-04-04golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-12-12Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫(kù)內(nèi)存實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫(kù)內(nèi)存實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Ubuntu下安裝Go語(yǔ)言開發(fā)環(huán)境及編輯器的相關(guān)配置
這篇文章主要介紹了Ubuntu下安裝Go語(yǔ)言開發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下2016-02-02