什么是动态找出结构内部的好方法?

时间:2014-04-22 10:38:35

标签: types struct go

所以如果我在Go中有以下结构:

type Person struct {
    name string
    age  int
}

鉴于我们不知道Person结构包含什么,我们怎样才能以编程方式找到?我看了一下,似乎可以用反射来做这件事吗?

即使只获取struct数据的键也是一个开头,因为类型为[]string,但理想情况下返回类型也很有用。

1 个答案:

答案 0 :(得分:2)

你确实可以使用反射来做到这一点。您主要想要reflect.TypeOfreflect.Type.Fieldreflect.Type.NumFieldreflect.StructField

代码:

package main

import "fmt"
import "reflect"

type Person struct {
    name string
    age  int
}

func main() {
    typ := reflect.TypeOf(Person{})
    for i := 0; i < typ.NumField(); i++ {
        field := typ.Field(i)
        fmt.Println("Field name:", field.Name)
        fmt.Println("Field type:", field.Type)
        fmt.Println()
    }
}

Playground link

一些注意事项:

  • 这适用于包中的结构和包中的结构
  • 如果您需要实际更改或读取数据,请使用reflect.ValueOf并将指针传递给结构,然后调用Value.Elem()
  • 您无法通过反映设置未导出的字段而不会发生恐慌(well, okay, you can, but it involves unsafe and ain't pretty),但您可以读取它们。不建议这样做。
  • 在使用之前,请务必考虑是否确实需要反射。目前,您需要让Go源成功导入包,因此如果您只需要知道字段名称,那么最好只是查看源代码。如果您需要在运行时知道,请问自己为什么以及是否有任何可能的解决方法。反思是一种错误和古怪行为的地雷。