去反映字段索引 - 单个索引与切片

时间:2015-06-01 15:02:33

标签: reflection go

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 Indexlen(field.Index) > 1的具体情况/具体情况如何?这是否支持枚举嵌入字段(可通过父级中的匿名字段访问)?在其他情况下会发生吗? (即。!field.Anonymous可以安全地假设,那么我们可以使用field.Index[0]作为Field(i int)的参数吗?)

2 个答案:

答案 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]
}