Как мне прочитать значение указателя на срез с помощью отражения? - PullRequest
1 голос
/ 24 января 2020
package main

import (
    "fmt"
    "reflect"
)

func main() {

    type tu struct {
        N int
    }

    type t struct {
        ARRAY []tu
        NESTED *tu
        NESTED_ARRAY []*tu
    }

    var n = t{[]tu{{4}}, &tu{5}, []*tu{{6}}}

    //print value
    fmt.Printf("value2: %v\n", reflect.ValueOf(&n).Elem().Field(1).Slice(0, 1))
    fmt.Printf("value3: %v\n", reflect.ValueOf(&n).Elem().Field(2).Elem().Field(0))
    fmt.Printf("value4: %v\n", reflect.ValueOf(&n).Elem().Field(3).Slice(0, 1).Elem().Field(0))

    return
}

Я пытаюсь получить доступ к значению указателя среза, используя отражение.

reflect.ValueOf(&n).Elem().Field(3).Slice(0, 1).Elem().Field(0) должно работать, но это не так.

Как мне go вокруг делать это?

1 Ответ

0 голосов
/ 24 января 2020

Индекс поля начинается с 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
...