使用反射获取结构字段的名称

新手上路,请多包涵

这里打印“Foo”的方式是什么?在这个例子中,打印的是“string”。

http://play.golang.org/p/ZnK6PRwEPp

 type A struct {
    Foo string
}

func (a *A) PrintFoo() {
    fmt.Println("Foo value is " + a.Foo)
}

func main() {
    a := &A{Foo: "afoo"}
    val := reflect.Indirect(reflect.ValueOf(a))
    fmt.Println(val.Field(0).Type().Name())
}

原文由 sat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 593
2 个回答

你想要 val.Type().Field(0).NameField reflect.Type 的方法将返回描述该字段的结构,其中包括名称和其他信息。

无法检索代表特定字段值的 reflect.Value 的字段名称,因为这是包含结构的属性。

原文由 James Henstridge 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为在结构中获取字段名称的更好方法是

func main() {
    a := &A{Foo: "afoo"}
    val := reflect.ValueOf(a).Elem()
    for i:=0; i<val.NumField();i++{
        fmt.Println(val.Type().Field(i).Name)
    }
}

有两个提示:

  1. 在你之后使用 .Elem() reflect.ValueOf(a) ,因为在你的情况下, a 是一个指针。
  2. val.Field(i).Type().Name 完全不同于 val.Type().Field(i).Name 。后者可以获取到struct中字段的名字

希望对你有帮助..

如果你想看更多案例,请查看 我的2mins文章

原文由 oscarz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题