使用反射检索结构体字段名称
在 Go 的反射功能中,可以使用 Reflect 包内省任意结构体。然而,一个常见的问题出现了:如何获取结构体字段的名称?
考虑以下代码:
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()) // Prints "string" }
在这个例子中,目标是使用打印“Foo”反射。但是,该代码当前打印“字符串”。为什么会发生这种情况?
答案在于反射包的方法:
要获取字段名称,我们必须首先获取结构体本身的reflect.Value。我们可以通过取消引用结构体指针并使用reflect.ValueOf 获取其reflect.Value 来完成此操作。
接下来,我们需要检索结构体第一个字段的reflect.Value。我们可以使用 val.Field(0).
最后,我们可以使用 val.Field(0).Type() 获取字段的 Reflect.Type。要获取字段名称,我们可以调用 val.Field(0).Type().Name()。
因此,下面修改后的代码将正确打印“Foo”:
fmt.Println(val.Field(0).Type().Field(0).Name())
以上是如何使用 Go 反射检索结构体字段的名称?的详细内容。更多信息请关注PHP中文网其他相关文章!