给定由两个嵌入的 struct StructAStructB组成的 struct CompleteStruct,其中StructB具有ImbStructC.

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
}

如何提取内部 struct 中的字段总数?

reflect.TypeOf(CompleteStruct{}).NumField())

我假设返回2,因为CompleteStruct由2个嵌入的 struct 组成.

我可以使用什么代码来显示CompleteStruct有6个字段?

推荐答案

需要递归来解决这个问题,因为嵌入的 struct 字段本身可能嵌入另一个 struct .

此外,还应注意不要将嵌入的 struct 视为字段--它们在reflect包中被列为"匿名"字段:

func countFields(v any) int {
    return rvCountFields(reflect.ValueOf(v))
}

func rvCountFields(rv reflect.Value) (count int) {

    if rv.Kind() != reflect.Struct {
        return
    }

    fs := rv.NumField()
    count += fs

    for i := 0; i < fs; i++ {
        f := rv.Field(i)
        if rv.Type().Field(i).Anonymous {
            count-- // don't count embedded structs (listed as anonymous fields) as a field
        }

        // recurse each field to see if that field is also an embedded struct
        count += rvCountFields(f)
    }

    return
}

https://go.dev/play/p/IjOllo86_xk

输出:

main.CompleteStruct : count = 5
main.StructA        : count = 3
main.StructB        : count = 2
main.StructC        : count = 6
main.StructD        : count = 12
main.Empty          : count = 0
int                 : count = 0

Go相关问答推荐

Go编译器标志-修剪路径不完全工作

使用恶意软件 scanner (ClamAV)时的Google云存储桶上传文件验证

调用API时使用nginx作为反向代理时从nginx获取502坏网关

[0]Func()as";请勿比较哨兵类型

AWS S3 SelectObjectContent在AWS SDK v2 for Go中不返回结果

Golang应用程序:所请求的资源上不存在HTTP-Control-Allow-Origin标头

使用GO从RDPMC获得价值

Go中的Slice[:1][0]与Slice[0]

如何为循环扫描的bufio scanner 设置超时?

Golang telegram 机器人

Go Template 动态获取变量

Golang 发送Post请求出现400错误

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

也许在 golang 中包(字符串和字符串类型不匹配)

SSH 代理,数据包长度错误

速率限制特定端点

Golang BigInt 部门

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

不理解切片和指针

Go 泛型是否与 LINQ to Objects 等效?