Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go每日一库之155:go-spew(输出 Go 数据结构)

Go每日一库之155:go-spew(输出 Go 数据结构)

作者头像
luckpunk
发布于 2023-10-02 00:17:26
发布于 2023-10-02 00:17:26
43600
代码可运行
举报
运行总次数:0
代码可运行

对于应用的调试,我们经常会使用 fmt.Println来输出关键变量的数据。或者使用 log 库,将数据以 log 的形式输出。对于基础数据类型,上面两种方法都可以比较方便地满足需求。对于一些结构体类型数据,通常我们可以先将其序列化后再输出。

如果结构体中包含不可序列化的字段,比如 func 类型,那么序列化就会抛出错误,阻碍调试。

go-spew

上面的需求,go-spew 可以完美地帮我们实现。go-spew 可以以一种非常友好的方式输出完整的数据结构信息。如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s := "GoCN"
i := 123

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

对于复杂的数据类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 等类型的数据都可以友好地展示出来。包括长度、字段类型、字段值、指针值以及指针指向的数据等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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%。该工具支持各种自定义配置,非常方便,可以有效提升我们日常开发的效率。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言经典库使用分析(八)| 变量数据结构调试利器 go-spew
我们在使用Golang(Go语言)开发的过程中,会通过经常通过调试的方式查找问题的原因,解决问题,尤其是当遇到一个很棘手的问题的时候,就需要知道一段代码在执行的过程中,其上下文的变量对应的数据,以便进行推测出问题的原因。
飞雪无情
2020/02/10
1K0
Colly源码解析——框架
        Colly是一个使用golang实现的数据抓取框架,我们可以使用它快速搭建类似网络爬虫这样的应用。本文我们将剖析其源码,以探析其中奥秘。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
1.2K0
「Go工具箱」推荐一个变量调试神器:go-spew
大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。同时了解其底层的实现原理,以便更深入地了解Go语言。
Go学堂
2023/01/31
3840
来了!Go的2个黑魔法技巧
导语 | 最近,在写Go代码的时候,我发现了其特别有意思的两个奇技淫巧或者黑魔法,若使用得好可以提升性能,用得不好就会招来恶魔,嘿嘿,于是写下这篇文章和大家分享一下。 一、魔法:调用runtime中的私有函数 按照Go的编译约定,代码包内以小写字母开头的函数、变量是私有的: package test // 私有func abs() {} // 公共func Abs() {} 对于test包中abs函数只能在包内调用,而Abs函数却可以在其它包中导入后使用。 私有变量、方法的意义在于封装:控制
腾讯云开发者
2022/04/19
1.9K0
来了!Go的2个黑魔法技巧
【Go】string 优化误区及建议
初学 Go 语言的朋友总会在传 []byte 和 string 之间有着很多纠结,实际上是没有了解 string 与 slice 的本质,而且读了一些程序源码,也发现很多与之相关的问题,下面类似的代码估计很多初学者都写过,也充分说明了作者当时内心的纠结:
thinkeridea
2019/11/04
1K0
【Go】string 优化误区及建议
Go每日一库之75:gorilla-schema
gorilla/schema 是 gorilla 开发工具包中用于处理表单的库。它提供了一个简单的方式,可以很方便地将表单数据转为结构体对象,或者将结构体对象转为表单数据。
luckpunk
2023/09/30
3260
Golang语言情怀--第136期 Go语言Ebiten引擎全栈游戏开发:第7节:video实例(直播技术基础)
video实例这个例子其实动视频、直播流、推拉流的技术人员,应该有种小惊喜;意思可以用Go来做视频监控,直播,视频播放器了,也不用自己再封装系统调用了,直播推拉流技术我一直再研究,有疑问的可以一起探讨。同时还是涉及到FFmpeg,如果不懂的可以和我交流
李海彬
2024/11/11
1600
Golang语言情怀--第136期 Go语言Ebiten引擎全栈游戏开发:第7节:video实例(直播技术基础)
go的 response 学习
response代表来自http request的响应先看看response的结构体定义type Response struct { Status string // e.g. "200 OK" StatusCode int // e.g. 200 Proto string // e.g. "HTTP/1.0" ProtoMajor int // e.g. 1 ProtoMinor int // e.g. 0 // Header map
IT工作者
2022/07/28
4980
kratos源码分析系列(6)
直接获取当前节点:selector/node/direct/direct.go
golangLeetcode
2023/09/06
6060
kratos源码分析系列(6)
8.Go编程快速入门学习
[TOC] 0x00 Go语言基础之Socket网络编程 现在的我们几乎每天都在使用互联网,但是你知道程序是如果通过网络互相通信吗? 描述: 相信大部分人通常是一知半解的,作为一个程序员👨‍💻‍,对于网络模型你应该了解,知道网络到底是怎么进行通信的,进行工作的,为什么服务器能够接收到请求,做出响应。这里面的原理应该是每个 Web 程序员应该了解的。 本章我们就一起来学习下Go语言中的网络编程,关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信。 1.基础概念介绍
全栈工程师修炼指南
2022/09/29
8180
8.Go编程快速入门学习
golang源码分析:davecgh/go-spew
spew是一个更友好的变量打印工具,github.com/davecgh/go-spew,它能打印指针指向的内容,避免直接打印的时候打印出来的是指针地址的问题,同时能够检测结构体中存在的环,解决了json序列化打印的时候不能打印环的问题,它提供了很多接口,可以打印到文件、json、和标准输出,逻辑都差不多,我们详细分析下打印到标准输出逻辑的实现。
golangLeetcode
2023/09/06
2550
golang源码分析:davecgh/go-spew
一个基于Web服务器的PoW区块链案例
这个工具包是读取.env后缀名的文件中的数据,如果是Linux环境,.env文件放置在项目的根目录即可,如果是Windows和Mac OS,.env文件需要放在GOPATH/src目录下。
Regan Yue
2021/11/15
6610
Go语言golang 200行写区块链源代码分析
Github上有一个Repo,是一个使用Go语言(golang),不到200行代码些的区块链源代码,准确的说是174行。原作者起了个名字是 Code your own blockchain in less than 200 lines of Go! 而且作者也为此写了一篇文章。 https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc
飞雪无情
2020/02/10
1.1K0
io.Reader 解析
简介 io.Reader 是一个 Interface 类型,功能非常强大,在任何需要读的地方我们都尽量使用它。先来看下它的原型: type Reader interface { Read(p []byte) (n int, err error) } 可见,任何实现了 Read() 函数的对象都可以作为 Reader 来使用。 Reader 类型 标准库中有许多不同的 Reader 类型,最常见的就是 bytes, strings 等几个库。我们或多或少都用过它们。下面来看几个最常见的例子: 文件操作 当
李海彬
2018/03/28
2.6K0
修复go tool pprof存在的“bug”
同事做了一定修改,把时间戳改成了看起来更直观的 Y-m-d H:i:s形式,最终得到的采样文件类似 mem_2023-11-02_05:47:58
fliter
2024/03/22
2890
修复go tool pprof存在的“bug”
Go每日一库之189:goutil/dump (打印漂亮易读的go 结构)
github.com/gookit/goutil/dump - 是一个golang数据打印工具包,可以打印出漂亮易读的go slice, map, struct数据。
luckpunk
2025/01/05
2080
慎写指针类型的全局变量
在 关于range二三事[1] 第二个case中,介绍了对于指针类型的 切片/map变量A 的循环,要格外注意, 迭代出的value作用域是整个方法而非循环体内.
fliter
2023/09/05
1860
慎写指针类型的全局变量
理解Go语言Web编程(上)
断断续续学Go语言很久了,一直没有涉及Web编程方面的东西。因为仅是凭兴趣去学习的,时间有限,每次去学,也只是弄个一知半解。不过这两天下定决心把Go语言Web编程弄懂,就查了大量资料,边学边记博客。希望我的这个学习笔记对其他人同样有帮助,由于只是业余半吊子学习,文中必然存在诸多不当之处,恳请读者留言指出,在此先道一声感谢! 本文只是从原理方面对Go的Web编程进行理解,尤其是详细地解析了net/http包。由于篇幅有限,假设读者已经熟悉Writing Web Applications这篇文章,这里所进行的工
李海彬
2018/03/22
1.3K0
理解Go语言Web编程(上)
手把手教你用 reflect 包解析 Go 的结构体 - Step 2: 结构体成员遍历
上一篇文章我们学习了如何用 reflect 检查一个参数的类型。这一篇文章,咱们获得了一个结构体类型,那么我们需要探究结构体内部的结构以及其对应的值。
amc
2021/06/29
2.3K0
手把手教你用 reflect 包解析 Go 的结构体 - Step 2: 结构体成员遍历
浅谈Go语言中的结构体struct &amp; 接口Interface &amp; 反射
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;
李海彬
2018/07/26
1.1K0
浅谈Go语言中的结构体struct &amp; 接口Interface &amp; 反射
相关推荐
Go语言经典库使用分析(八)| 变量数据结构调试利器 go-spew
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验