reflect.StructField
有一个Index
字段,其类型为[]int
。关于此的文档有点令人困惑:
Index []int // index sequence for Type.FieldByIndex
当然Type.FieldByIndex
正如预期的那样,对其行为有一些更明确的解释:
// FieldByIndex returns the nested field corresponding
// to the index sequence. It is equivalent to calling Field
// successively for each index i.
// It panics if the type's Kind is not Struct.
FieldByIndex(index []int) StructField
但是,还有Type.Field()
:
// Field returns a struct type's i'th field.
// It panics if the type's Kind is not Struct.
// It panics if i is not in the range [0, NumField()).
Field(i int) StructFiel
所以这些行为分别非常明确。
我的问题:reflect.StructField
Index
与len(field.Index) > 1
的具体情况/具体情况如何?这是否支持枚举嵌入字段(可通过父级中的匿名字段访问)?在其他情况下会发生吗? (即。!field.Anonymous
可以安全地假设,那么我们可以使用field.Index[0]
作为Field(i int)
的参数吗?)
答案 0 :(得分:2)
它可以递归地引用嵌入或非嵌入结构中的字段:
type Foo struct {
Bar string
}
type Baz struct {
Zoo Foo
}
func main() {
b := Baz{Zoo:Foo{"foo"}}
v := reflect.ValueOf(b)
fmt.Println(v.FieldByIndex([]int{0})) //output: <main.Foo Value>
fmt.Println(v.FieldByIndex([]int{0, 0})) //output: foo
}
答案 1 :(得分:0)
这里是一个例子。为了回答这个问题,我研究了反射测试。
package main
import (
"fmt"
"reflect"
)
type (
Bar struct {
Val string
}
Foo struct {
Bar
}
)
func main() {
t := reflect.TypeOf(Foo{})
f, _ := t.FieldByName("Val")
fmt.Println(f.Index) // [0 0]
}