如何统计Golang嵌套结构体CompleteStruct的总字段数?
统计Go嵌套嵌入结构体的所有字段总数
要统计包含嵌套嵌入结构体的所有实际字段,需要通过递归遍历反射类型来处理每个嵌入的匿名结构体,代码实现如下:
package main import ( "fmt" "reflect" ) type StructA struct { AA int AB int AC int } type ImbStructC struct { BCC int } type StructB struct { BA int BB int ImbStructC } type CompleteStruct struct { StructA StructB } // countAllFields 递归统计结构体的所有字段(包括嵌套嵌入的匿名结构体字段) func countAllFields(t reflect.Type) int { count := 0 for i := 0; i < t.NumField(); i++ { field := t.Field(i) // 如果是匿名嵌入的结构体,递归统计其内部字段 if field.Anonymous { // 处理指针类型的嵌入结构体(如果有的话) fieldType := field.Type if fieldType.Kind() == reflect.Ptr { fieldType = fieldType.Elem() } if fieldType.Kind() == reflect.Struct { count += countAllFields(fieldType) } } else { // 非匿名字段直接计数 count++ } } return count } func main() { completeType := reflect.TypeOf(CompleteStruct{}) totalFields := countAllFields(completeType) fmt.Printf("CompleteStruct 实际包含的字段总数:%d\n", totalFields) // 输出:6 }
代码逻辑说明
- 递归函数
countAllFields接收reflect.Type类型参数,遍历当前类型的所有字段 - 遇到匿名嵌入的字段时,判断其类型是否为结构体(或指针指向的结构体),若是则递归调用自身统计该结构体的字段
- 非匿名字段直接计入总数
- 额外处理了指针类型的嵌入结构体,确保多层嵌套指针场景也能正确统计
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

