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中的动态嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章