Иди размышляй найди structtag

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

для структуры A есть метод в отражении, что я могу найти поле с помощью structtag, как

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

1 ответ

Решение

Для этого нет встроенного метода / функции. Существующий FieldBy* методы в reflect реализованы в виде циклов (см. `src/ отражения /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")
Другие вопросы по тегам