-1
type A struct {
    Name *NameS `json:"name"`
}

对于结构 A,是否有一种方法可以反映我可以通过 structtag 找到一个字段,例如

reflect.ValueOf(&ns)
// struct
s := ps.Elem()
s.FieldByTag("name")
4

1 回答 1

2

没有内置的方法/功能可以做到这一点。中的现有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
}

请注意,tagKeyandtagValue是单独传递的,因为这就是reflect.StructField工作原理。所以在你的情况下,你会这样称呼它:

field, ok := fieldByTag(&ns, "json", "name")
于 2019-08-08T14:01:02.250 回答