06 March 2017

IMG-THUMBNAIL

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