可通过 reflect.TypeOf(s).NumField() 获取结构体字段总数,包括导出与非导出字段;若需仅统计导出字段,需遍历并用 Field(i).IsExported() 判断。
在 Go 语言中,可以通过 reflect 包动态获取结构体的字段数量,核心是使用 reflect.TypeOf 获取类型信息,再调用 Type.NumField() 方法。
对任意结构体变量或类型,先用 reflect.TypeOf 转为 reflect.Type,该接口提供 NumField() 方法,返回导出与非导出字段的总个数(不区分是否可导出)。
Elem() 获取所指类型的 Type示例:
type User struct { Name string; age int; Active bool }Go 的反射无法直接过滤“导出性”,但可通过循环遍历每个字段并检查 Field(i).IsExported() 判断。注意:该方法作用于 reflect.StructField,需配合 Type.Field(i) 使用。
立即学习“go语言免费学习笔记(深入)”;
IsExported() 返回 true 当且仅当字段名首字母为大写Field(i) 会 p
anic,务必先确认 Kind() == reflect.Struct
示例逻辑:
n := 0为避免 panic,建议封装一个健壮函数,自动处理指针解引用和类型校验。
Kind() 判断是否为结构体或指向结构体的指针Elem() 向下取一级;若仍为指针,继续取,直到到达结构体或失败NumField()
这样可支持 User{}、&User{}、甚至 **User(只要最终能解出结构体)。
NumField() 统计的是直接定义在该结构体中的字段数,包括匿名字段(嵌入字段)。例如:
虽然 Info 是一个结构体,但它作为匿名字段被计入 —— 这里两个字段是 Info(匿名)和 Name(具名),不是 Info.ID 和 Name。若想展开嵌套字段总数,需递归遍历。