如何使用反射获取指针的基础类型?

时间:2015-01-28 20:06:28

标签: pointers go reflection struct

我想要的是获取AB的字段,例如

type A struct {
  Field_1 string
}
type B struct {
  *A
}

fieldsOfA := someMagicFunc(&B{})

1 个答案:

答案 0 :(得分:2)

您可以使用Value获取某个变量的reflect.ValueOf()反映对象。

如果您还想修改变量或其字段,则必须将变量的地址(指针)传递给ValueOf()。在这种情况下,Value将属于指针(不是指向的值),但您可以使用Value.Elem()来导航"到尖头物体的Value

*A嵌入在B中,因此A的字段可以从B的值引用。您只需使用Value.FieldByName()按名称访问字段,即可获取或设置其值。

这样做可以在Go Playground上尝试:

b := B{A: &A{"initial"}}
fmt.Println("Initial value:", *b.A)

v := reflect.ValueOf(&b).Elem()
fmt.Println("Field_1 through reflection:", v.FieldByName("Field_1").String())

v.FieldByName("Field_1").SetString("works")
fmt.Println("After modified through reflection:", *b.A)

输出:

Initial value: {initial}
Field_1 through reflection: initial
After modified through reflection: {works}

我建议您阅读此博客文章,了解Go中反射的基础知识:

The Laws of Reflection