網站首頁 編程語言 正文
對于應用的調試,我們經常會使用 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)
原文鏈接:https://mp.weixin.qq.com/s/qfukFmJRcBAjn-e2K73VLQ
相關推薦
- 2022-05-19 redis擊穿?雪崩?穿透超詳細解決方案梳理_Redis
- 2022-04-17 C語言?自定義類型全面系統理解_C 語言
- 2023-07-16 spring boot多模塊打包 運行
- 2022-12-23 Kubernetes調度管理優先級和搶占機制詳解_云其它
- 2023-07-28 el-table 合并單元格(合并行)
- 2022-02-03 gogs倉庫代碼拉取不需要用戶賬號驗證問題
- 2022-05-29 Redis?哨兵機制及配置實現_Redis
- 2022-10-26 C++賦值函數+移動賦值函數+移動構造函數詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支