去反映通过结构标签找到
go reflect find by structtag
type A struct {
Name *NameS `json:"name"`
}
对于一个struct A,有没有reflect方法可以通过structtag找到一个字段
喜欢
reflect.ValueOf(&ns)
// struct
s := ps.Elem()
s.FieldByTag("name")
没有内置的 method/function 可以执行此操作。 reflect
中现有的 FieldBy*
方法被实现为循环(参见`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
和 tagValue
是分开传递的,因为 reflect.StructField
就是这样工作的。所以在你的情况下你会这样称呼它:
field, ok := fieldByTag(&ns, "json", "name")
type A struct {
Name *NameS `json:"name"`
}
对于一个struct A,有没有reflect方法可以通过structtag找到一个字段 喜欢
reflect.ValueOf(&ns)
// struct
s := ps.Elem()
s.FieldByTag("name")
没有内置的 method/function 可以执行此操作。 reflect
中现有的 FieldBy*
方法被实现为循环(参见`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
和 tagValue
是分开传递的,因为 reflect.StructField
就是这样工作的。所以在你的情况下你会这样称呼它:
field, ok := fieldByTag(&ns, "json", "name")