gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:43:14 25 4
gpt4 key购买 nike

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

type Person struct {
name string
age int
}

鉴于我们不知道 Person 结构的组成部分,我们如何通过编程找出答案?我环顾四周,似乎可以使用反射来做到这一点?

即使只是获取结构数据的键也是一个开始,如 []string 类型,但理想情况下取回类型也是有用的。

最佳答案

您确实可以使用反射来做到这一点。您主要需要 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()
  • 您不能设置另一个包中未导出的字段,而不会出现 panic (well, okay, you can, but it involves unsafe and ain't pretty),但您可以读取它们。不推荐这样做。
  • 在使用反射之前,请始终考虑您是否真的需要反射。目前,你需要有 Go 源代码才能成功导入包,所以如果你只需要知道字段名称,那么直接浏览源代码可能会更好。如果您需要在运行时知道,问问自己为什么以及是否有任何可能的解决方法。 Reflect 是错误和古怪行为的地雷。

关于types - 什么是动态找出结构内部内容的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23217146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com