我想迭代结构的字段并获取每个字段的名称。所以我在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字段的名字?
答案 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)
}
}