Индекс поля начинается с 0
, а не 1
. Так что уменьшите все индексы на 1.
И в вашем последнем примере вызов Value.Slice()
возвращает срез, а не указатель (не элемент среза, а подлис). Если вам нужен элемент, позвоните по этому номеру Value.Index()
, тогда вы можете позвонить Elem()
и Field()
:
fmt.Printf("value2: %v\n", reflect.ValueOf(&n).Elem().Field(0).Slice(0, 1))
fmt.Printf("value3: %v\n", reflect.ValueOf(&n).Elem().Field(1).Elem().Field(0))
fmt.Printf("value4: %v\n", reflect.ValueOf(&n).Elem().Field(2).Slice(0, 1).Index(0).Elem().Field(0))
Будет выведено (попробуйте на Go Playground ):
value2: [{4}]
value3: 5
value4: 6
Также обратите внимание, что метод Value.Slice()
эквивалентен нарезке выражение. Если вам нужен элемент, просто позвоните Value.Index()
, вам не нужен метод Slice()
:
fmt.Printf("value2: %v\n", reflect.ValueOf(&n).Elem().Field(0).Index(0))
fmt.Printf("value3: %v\n", reflect.ValueOf(&n).Elem().Field(1).Elem().Field(0))
fmt.Printf("value4: %v\n", reflect.ValueOf(&n).Elem().Field(2).Index(0).Elem().Field(0))
Это выдаст (попробуйте этот на Go Playground ):
value2: {4}
value3: 5
value4: 6