Golang中如何获取结构体struct的属性(字段)总数量?
实现方案
Go 语言本身没有内置的结构体字段计数语法,你需要借助标准库 reflect 包获取运行时类型信息来实现该功能,完整可运行代码如下:
package main import ( "fmt" "reflect" ) type Client struct { name string // 第1个字段 lastName string // 第2个字段 age uint // 第3个字段 } // getLengthAttibutes 返回结构体的字段总个数 func (c Client) getLengthAttibutes() int { // 获取结构体的反射类型对象 t := reflect.TypeOf(c) // 兼容指针类型接收器的场景,后续如果把接收器改成*Client不需要重写逻辑 if t.Kind() == reflect.Ptr { t = t.Elem() } // 仅对结构体类型返回字段数,非结构体返回0避免panic if t.Kind() != reflect.Struct { return 0 } return t.NumField() } func main() { client := Client{name: "Facundo", lastName: "Veronelli", age: 23} fmt.Println(client.getLengthAttibutes()) // 输出结果为 3 }
注意事项
NumField()统计的是当前结构体层级的显式定义字段,嵌套的匿名嵌入结构体本身会被算作1个字段,嵌入结构体内部的字段不会被统计,如果你需要递归统计所有层级的字段,可以自行加递归遍历逻辑- 不要直接对非结构体类型调用
NumField()方法,会触发运行时panic,上述代码已经加了类型判断兼容异常场景 - 如果需要只统计公开字段(首字母大写的字段),可以遍历所有字段判断
Field(i).IsExported()的返回值再计数
内容的提问来源于stack exchange,提问作者Facundo Veronelli
相关产品推荐
相关产品推荐

