type A struct {
Name *NameS `json:"name"`
}
对于结构 A,是否有一种方法可以反映我可以通过 structtag 找到一个字段,例如
reflect.ValueOf(&ns)
// struct
s := ps.Elem()
s.FieldByTag("name")
type A struct {
Name *NameS `json:"name"`
}
对于结构 A,是否有一种方法可以反映我可以通过 structtag 找到一个字段,例如
reflect.ValueOf(&ns)
// struct
s := ps.Elem()
s.FieldByTag("name")
没有内置的方法/功能可以做到这一点。中的现有FieldBy*
方法reflect
被实现为循环(参见`src/reflect/type.go)。您还可以编写一个循环来实现您需要的内容。一种方法可能是这样的:
func fieldByTag(s interface{}, tagKey, tagValue string) (reflect.StructField, bool) {
rt := reflect.TypeOf(s)
for i := 0; i < rt.NumField(); i++ {
field := rt.Field(i)
if field.Tag.Get(tagKey) == tagValue {
return field, true
}
}
return reflect.StructField{}, false
}
请注意,tagKey
andtagValue
是单独传递的,因为这就是reflect.StructField
工作原理。所以在你的情况下,你会这样称呼它:
field, ok := fieldByTag(&ns, "json", "name")