Первый:
for i := 0; i < tt.NumField(); i++ {
field := tt.Field(i)
Каждый шаг здесь перебирает поля вашего экземпляра типа T
. Таким образом, поля будут A
, а точнее - дескриптор поля, чей Name
равен A
и который описывает int с его json и тестовыми тегами, а затем B
(с такими же подробными подробностями, если мы go далее).
Поскольку оба дескриптора поля имеют только два элемента Get
, вы, вероятно, намеревались использовать Get("test")
, как в ответ Гуарава Дхимана .
Однако, если вы сделаете это, результат будет "testaaa"
, когда вы находитесь в поле A
и "testbbb"
, когда вы находитесь в поле B
. Если мы аннотируем код Гуарава немного больше:
for i := 0; i < tt.NumField(); i++ {
field := tt.Field(i)
newTTag := field.Tag.Get("test")
fmt.Printf("newTTag = %#v\n", newTTag)
tValue := tv.Field(i)
newTfield := newTValue.Elem().FieldByName(newTTag)
fmt.Printf("newTfield = %#v\n", newTfield)
if newTfield.CanSet() {
newTfield.Set(tValue)
}
}
, мы увидим этот вывод:
newTTag = "testaaa"
newTfield = <invalid reflect.Value>
newTTag = "testbbb"
newTfield = <invalid reflect.Value>
Нам нужно сделать строку test
в каждом имени тега поле в типе newT
:
type T struct {
A int `json:"aaa" test:"AA"`
B string `json:"bbb" test:"BB"`
}
(Guarav фактически уже сделал это, но не упомянул об этом.) Теперь программа производит то, что (предположительно) вы намеревались:
&{123 hello}
Полная программа с закомментированной трассировкой здесь .