哪里网站做的好,crm在线演示,做的好点的外贸网站有哪些,佛山网站设计怎么做问题
json包里使用的时候#xff0c;会结构体里的字段边上加tag#xff0c;有没有什么办法可以获取到这个tag的内容呢#xff1f;
举例 tag信息可以通过反射#xff08;reflect包#xff09;内的方法获取#xff0c;通过一个例子加深理解。
package mainimport (会结构体里的字段边上加tag有没有什么办法可以获取到这个tag的内容呢
举例 tag信息可以通过反射reflect包内的方法获取通过一个例子加深理解。
package mainimport (fmtreflect
)type J struct {a string //小写无tagb string json:B //小写tagC string //大写无tagD string json:DD otherTag:good //大写tag
}func printTag(stru interface{}) {t : reflect.TypeOf(stru).Elem()for i : 0; i t.NumField(); i {fmt.Printf(结构体内第%v个字段 %v 对应的json tag是 %v , 还有otherTag %v \n, i1, t.Field(i).Name, t.Field(i).Tag.Get(json), t.Field(i).Tag.Get(otherTag))}
}func main() {j : J{a: 1,b: 2,C: 3,D: 4,}printTag(j)
}
输出
结构体内第1个字段 a 对应的json tag是 , 还有otherTag 结构体内第2个字段 b 对应的json tag是 B , 还有otherTag 结构体内第3个字段 C 对应的json tag是 , 还有otherTag 结构体内第4个字段 D 对应的json tag是 DD , 还有otherTag good
解释
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的代码。
func typeFields(t reflect.Type) []field {// 注释掉其他逻辑...// 遍历结构体内的每个字段for i : 0; i f.typ.NumField(); i {sf : f.typ.Field(i)isUnexported : sf.PkgPath ! // 注释掉其他逻辑...if isUnexported {// 如果是不可导出的变量则跳过continue}// 如果是可导出的变量public则获取其json字段tag : sf.Tag.Get(json)// 注释掉其他逻辑...} // 注释掉其他逻辑...
}