Golang 通过fmt包输出完整struct信息
06 March 2017
Golang虽然自带调试工具,但是我从来没用过。据说大神都是通过打印日志来调试^ ^。那么问题来了,如何才能完整的打印一个对象?
通过fmt
调试,是非常常见的做法,打印一个对象,我一直都是在用
fmt.Println(a)
或者
fmt.Printf("%v", a)
打印复杂对象不能用内置的println
,这个只会打印出来指针,看不到内容。而上面两种方式是可以打印结构体内容的,但是没有值对应的名字。
func main() {
a := new(AAA)
a.A = "Hello"
fmt.Println(a)
}
type AAA struct {
A string
}
结果:
&{Hello}
如果结构很复杂,内部变量很多,多个值之间只会通过空格分隔,而且如果有的值是空字符串,这就是一件非常尴尬的事情了,肉眼根本就看不出来有一个空格。
所以我一直的方法就是把结构体通过Json编码,再输出。现在想想真蠢。
fmt
包内置的方法,本来就可以展示类似Json的形式,没必要自己瞎搞。把上面的输出代码改了:
fmt.Printf("%+v\n", a)
结果:
&{A:Hello}
就是这么简单。
查看源码,fmt/print.go的926行:
if p.fmt.plusV || p.fmt.sharpV {
if f := t.Field(i); f.Name != "" {
p.buf.WriteString(f.Name)
p.buf.WriteByte(':')
}
}
p.printValue(getField(v, i), verb, depth+1)
通过反射拿到变量的Name,printValue
方法也是通过反射拿到值,最后打印。这里就不展开说了。
结论
其实这个东西没多高端,官方文档上来就介绍了。想起来每次调试都那么费尽,以后还是得多看看这些。温故而知新,可以为师矣。
%v the value in a default format when printing structs, the plus flag (%+v) adds field names
后续
Go 的官方问题有个小缺陷就是太精简了,很多东西说明不是那么细致。今天看到一篇文章,详细说明了格式化输出的写法,How to format anything (string, number or arbitrary data) with fmt。
完整介绍 Golang 格式化输出:fmt 如何进行格式化?
原文链接:Golang 通过fmt包输出完整struct信息,转载请注明来源!
–EOF–