1
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)应该工作,但它没有。

我应该怎么做呢?

4

1 回答 1

0

字段索引以 开头0,而不是1。因此,将所有索引减 1。

在你的最后一个例子中,Value.Slice()调用返回一个切片,而不是一个指针(不是切片的元素,而是一个子切片)。如果您需要一个元素,请调用Value.Index()它,然后您可以调用Elem()and 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
于 2020-01-24T13:09:52.110 回答