
回复
json
包里使用的时候,会结构体里的字段边上加tag
,有没有什么办法可以获取到这个tag
的内容呢?
tag信息可以通过反射(reflect包)内的方法获取,通过一个例子加深理解。
输出
printTag
方法传入的是j的指针。reflect.TypeOf(stru).Elem()
获取指针指向的值对应的结构体内容。NumField()
可以获得该结构体的含有几个字段。t.Field(i).Tag.Get("json")
可以获取到tag
为json
的字段。多个tag
,比如叫otherTag
,同样可以通过t.Field(i).Tag.Get("otherTag")
获得。上篇文章 提到json包
不能导出私有变量的tag
是因为取不到反射信息
的说法,但是直接取t.Field(i).Tag.Get("json")
却可以获取到私有变量的json字段
,是为什么呢?
其实准确的说法是,json
包里不能导出私有变量的tag
是因为json
包里认为私有变量为不可导出的Unexported
,所以跳过获取名为json
的tag
的内容。具体可以看/src/encoding/json/encode.go:1070
的代码。
文章转载自公众号:小白debug