Tip #82 使用%+v%q来增强调试输出,而不是使用%v%s

原始链接:Golang Tip #82: Enhance Debug Output with %+v and %q Instead of %v and %s

当我们进行调试时,能够从日志中获得更清晰、更详细的输出对我们来说这会是一个巨大的帮助。

举一个常见的场景,你正在用fmt.Println快速检查一个结构体的状态:

这里输出 {30 15 5} 并不会立即告诉我们哪个数字代表胜利(Wins),哪个代表失败(Losses),或者哪个代表平局(Draws)

除非你记得在结构体中定义的顺序。

但是,通过使用 %+v%#v(它们确实是 %v 的变体),我们可以使输出更加具有信息量和易于理解:

  • %+v 非常好,因为它在输出中直接包含了字段名,消除了每个值代表什么的任何混淆。
  • %#v 更进一步,显示了包含包名和结构体类型的完整结构。这可能比你日常需要的细节更多,但在更复杂的场景中会非常有用。

“%q 怎么样?”

%q 本质上是一个将字符串用引号括起来的快捷方式,而 %s 只是原样输出字符串。

这种区别在处理以下情况时特别有用:

  • 可能是空的字符串
  • 或者包含特殊字符或空格,这些字符不是立即可见的:

只要看一下使用每种格式化选项生成的日志,就会注意到当使用 %q 时,问题变得多么清晰?

“但是有什么缺点呢?”

不过,有一点需要注意,那就是 %q 不会解释像 \t\n 这样的转义字符,这可能会使字符串更难阅读。

(实际上,这可能非常有用,因为它会向你展示字符串中确切的内容,保留所有的特殊字符。)