我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go-spew调试利器详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go-spew调试利器详解

对于应用的调试,我们经常会使用 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)

到此这篇关于 go-spew调试利器的文章就介绍到这了,更多相关 go-spew调试利器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go-spew调试利器详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go单元测试利器testify使用示例详解

这篇文章主要为大家介绍了Go单元测试利器testify使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-15

基于node.js之调试器详解

1.在命令行窗口中,可以使用"node debug" 命令来启用调试器,代码如下: node debug<需要被执行的脚本文件名>接下来根据一个实例进行学习调试过程: 编写app.js文件进行调试:console.log('hello,wo
2022-06-04

Go调度器学习之系统调用详解

这篇文章肿,将以一个简单的文件打开的系统调用,来分析一下Go调度器在系统调用时做了什么。文中的示例代码讲解详细,需要的可以参考一下
2023-05-14

golang 调试函数的利器

go 中调试函数的利器有:debugging statements:使用内置函数打印中间变量和状态信息。panic() 和 recover():中止程序并捕获 panic,进行错误处理。custom assertions:定义自定义断言以强
golang 调试函数的利器
2024-05-06

Python详解之调试:pdb

如果使用过微软技术的朋友应该体会过微软的Visual Studio系列IDE给debug程序带来的方便,换了个工作就没有Visual Studio了,对于我这种从未在非GUI环境下调试过程序的人来说实在有点不爽,今天花了点时间看了一下Py
2023-01-31

Python自动化测试利器selenium详解

Selenium是一种常用的Web自动化测试工具,支持多种编程语言和多种浏览器,可以模拟用户的交互行为,自动化地执行测试用例和生成测试报告。Selenium基于浏览器驱动实现,结合多种定位元素的方法,可以实现各种复杂的Web应用程序的测试
2023-05-18

go并发利器sync.Once使用示例详解

这篇文章主要为大家介绍了go并发利器sync.Once使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-14

C++ 函数调试详解:如何使用调试器定位问题?

使用调试器定位问题是 c++++ 函数调试的关键,具体步骤有:设置断点以暂停执行。单步执行代码以逐行查看变量值。检查变量以查看值和类型。使用调用栈显示函数调用序列。通过遵循这些步骤,你可以有效地调试函数,识别错误并提高代码质量。C++ 函数
C++ 函数调试详解:如何使用调试器定位问题?
2024-05-01

利用uniapp开发APP时的调试/安卓打包等详解

uni-app​​是一个使用​​Vue.js开发所有前端应用的框架,开发者编写一套代码,下面这篇文章主要给大家介绍了关于利用uniapp开发APP时的调试/安卓打包等的相关资料,需要的朋友可以参考下
2022-12-08

Android Studio断点调试详解

本文目录概述调试方法第一步:添加测试代码第二步:添加断点第三步:调试show Execution pointStep OverStep IntoForce Step IntoStep Outrun to Cursor查看断点修改变量值停止调
2022-06-06

python调试模块ipdb详解

ipdb是用来python中用以交互式debug的模块,可以直接利用pip安装,这篇文章主要介绍了python调试模块ipdb详解,需要的朋友可以参考下
2023-03-19

Android 手机浏览器调试使用Chrome进行调试实例详解

使用PC上的 Chrome 远程调试手机端的页面工具准备手机端:chrome for Android,; PC端:安装谷歌浏览器(最好是最新版的开发者版本)USB 连接线, 也就是你充电器的那条线 开启调试模式 使用 USB 连接你的电脑,
2022-06-06

使用Chrome浏览器调试Android App详解

个人一直对Chrome情有独钟,Chrome除了更快之外,对开发者的支持更友好。内置强大的Developer Tools,相信Web开发简直爱不释手!而且Chrome Store里提供各种各样的插件,没有你用不到,只有你想不到。现在任何事基
2022-06-06

利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)

前提 Node.js 6.3+, 这个可上Node.js官网自行下载;Chrome 55+. 如果您本地的chrome升级到最新版后还是<55, 可以从此处下载:Chrome Canary,亲测可行。配置 就目前来说,在浏览器端并行调试Ja
2022-06-04

C++ 函数调试详解:如何调试宏中的问题?

如何调试宏中的问题?调试宏中的常见问题包括语法错误、参数错误和意外展开。可以采用以下技巧:使用预处理器宏 (#undef、#define) 孤立问题。使用输出语句 (#ifdef) 洞察宏展开。设置调试器断点逐语句执行宏展开。启用编译器警告
C++ 函数调试详解:如何调试宏中的问题?
2024-05-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录