【问题标题】:How do I read the value of a pointer to a slice using reflect?如何使用反射读取指向切片的指针的值?
【发布时间】:2020-05-10 19:30:16
【问题描述】:
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) 应该可以工作,但不能。

我应该怎么做?

【问题讨论】:

    标签: pointers go slice reflect


    【解决方案1】:

    字段索引以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
    

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 2017-07-31
      • 2015-05-01
      • 2012-08-21
      • 2021-09-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多