如何使用反射读取指向切片的指针的值?
How do I read the value of a pointer to a slice using reflect?
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)
应该可以,但没有。
我应该怎么做?
字段索引以 0
开头,而不是 1
。所以将所有索引减少 1.
在你的最后一个例子中 Value.Slice()
call returns a slice, not a pointer (not an element of the slice, but a subslice). If you need an element, call Value.Index()
on that, then you can call 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
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)
应该可以,但没有。
我应该怎么做?
字段索引以 0
开头,而不是 1
。所以将所有索引减少 1.
在你的最后一个例子中 Value.Slice()
call returns a slice, not a pointer (not an element of the slice, but a subslice). If you need an element, call Value.Index()
on that, then you can call 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