golang中的动态嵌套结构

Posted

技术标签:

【中文标题】golang中的动态嵌套结构【英文标题】:Dynamic nested struct in golang 【发布时间】:2021-08-08 00:29:53 【问题描述】:

我想创建一个动态结构。我正在使用一些命令来获取一些 JSON 格式的信息,并希望将其解组为一个结构。 Json 看起来像这样:


"blockdevices": [
    
        "disk_name": "sda",
        "mountpoint": null,
        "size": "50G",
        "fstype": "mpath_member",
        "partitions": [
            
                "disk_name": "sda1",
                "mountpoint": null,
                "size": "20G",
                "fstype": "vfat"
            ,
            
                "name": "3600a09803830566e615d5171774a3837",
                "mountpoint": null,
                "size": "50G",
                "fstype": null,
                "partitions": [
                    
                        "disk_name": "3600a09803830566e615d5171774a3837-part1",
                        "mountpoint": "/myData",
                        "size": "20G",
                        "fstype": "vfat",
                        "partitions": [
                            
                                "disk_name": "3600a09803830566e615d5171774a3837-part2",
                                "mountpoint": "/myData2",
                                "size": "10G",
                                "fstype": "vfat"
                            
                        ]
                    
                ]
            
        ]
    
]

问题是可能有 b 个未知子分区可以是 1 也可以是任意数量。 我创建了以下结构:

Blockdevices []struct 
    DiskName   string      `json:"disk_name"`
    Mountpoint interface `json:"mountpoint"`
    Size       string      `json:"size"`
    Fstype     string      `json:"fstype"`
    Partitions []struct 
        DiskName      string      `json:"disk_name"`
        Mountpoint    interface `json:"mountpoint"`
        Size          string      `json:"size"`
        Fstype        string      `json:"fstype"`
        SubPartitions bool        `json:"sub_partitions"`
        Partitions    []struct 
            DiskName   string `json:"disk_name"`
            Mountpoint string `json:"mountpoint"`
            Size       string `json:"size"`
            Fstype     string `json:"fstype"`
            Partitions []struct 
                DiskName   string `json:"disk_name"`
                Mountpoint string `json:"mountpoint"`
                Size       string `json:"size"`
                Fstype     string `json:"fstype"`
             `json:"partitions,omitempty"`
         `json:"partitions,omitempty"`
     `json:"partitions,omitempty"`
 `json:"blockdevices"`

它最多可用于两个子分区,但我想要一个无论我们有多少子分区都可以正常工作的解决方案。有没有办法这样做。磁盘结构中的分区结构是一样的,我们可以像只写一次但它作为循环工作吗?

先谢谢了!

【问题讨论】:

【参考方案1】:

结构可以定义为recursively。为 Partition 定义一个单独的结构(作为一个受欢迎的副作用,这也使您的代码更易于处理,而不是在一个大的嵌套类型中定义整个 JSON 结构)并拥有该结构引用本身(注意 Partitions 属性在Partition 类型中):

type Blockdevice struct 
    DiskName   string      `json:"disk_name"`
    Mountpoint interface `json:"mountpoint"`
    Size       string      `json:"size"`
    Fstype     string      `json:"fstype"`
    Partitions []Partition `json:"partitions"`


type Partition struct 
    DiskName      string      `json:"disk_name"`
    Mountpoint    interface `json:"mountpoint"`
    Size          string      `json:"size"`
    Fstype        string      `json:"fstype"`
    SubPartitions bool        `json:"sub_partitions"`
    Partitions    []Partition `json:"partitions"`

【讨论】:

【参考方案2】:

定义一个Partition 结构:

type Partition struct 
   DiskName      string      `json:"disk_name"`
   Mountpoint    interface `json:"mountpoint"`
   Size          string      `json:"size"`
   Fstype        string      `json:"fstype"`
   SubPartitions bool        `json:"sub_partitions"`
   Partitions    []Partition `json:"partitions"`

这可以使用分区切片尽可能多地嵌套。在BlockDevice 中使用这种类型。

【讨论】:

以上是关于golang中的动态嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

Golang入门到项目实战 | golang嵌套结构体

golang结构体组合与“多态” 2021-08-06

golang结构体嵌套和用结构体实现模拟“继承”

golang go中嵌套结构的实现

在GoLang中使用嵌套结构打印struct的奇怪行为

Go语言自学系列 | golang嵌套结构体