golang StructField的名字返回一个指针?

时间:2013-12-27 11:43:21

标签: go

我想迭代结构的字段并获取每个字段的名称。所以我在play.golang.org上试试这个:http://play.golang.org/p/C2cWzEVRBl

为方便起见,我引用了

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"allan", 10}

    v := reflect.ValueOf(p)
    num := v.NumField()
    for i := 0; i < num; i++ {
        fv := v.Field(i)
        t := reflect.TypeOf(fv)
        fmt.Println("struct name:",t.Name)
    }
}

在我的运行中,输出如下:

struct name: 0x203a0
struct name: 0x203a0

然而,我一直期待它

struct name: Name
struct name: Age

你能解释为什么它显示为一个地址,我怎样才能正确得到一个struct字段的名字?

1 个答案:

答案 0 :(得分:2)

最后找出问题......

不应在字段Value上使用TypeOf(),在原始结构上使用TypeOf,并使用Field()来检索StructField

工作代码如下:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"allan", 10}

    v := reflect.ValueOf(p)
    num := v.NumField()
    for i := 0; i < num; i++ {
        //fv := v.Field(i)
        //t := reflect.TypeOf(fv)
        // SHOULD NOT USE TypeOf() on a field Value!
        // Use TypeOf on original struct, and use Field() to retrieve StructField
        sf := reflect.TypeOf(p).Field(i)
        fmt.Println("Field name:",sf.Name)

    }
}