在 golang 中循环动态嵌套结构

Loop over a dynamic nested struct in golang

我创建了一个动态结构来解组 JSON。 结构看起来像:

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

type NasInfo struct {
    Blockdevices []struct {
        DiskName   string      `json:"disk_name"`
        Mountpoint interface{} `json:"mountpoint,omitempty"`
        Size       string      `json:"size"`
        Fstype     string      `json:"fstype,omitempty"`
        Partitions []Partition `json:"partitions,omitempty"`
    } `json:"blockdevices"`
}

现在块设备内部可以有多个分区,一个分区可以有多个子分区。我想手动为分区结构中的字段赋值。我怎样才能做到这一点。 我如何遍历每个分区和子分区并为其分配手动值。 有什么办法吗?

目前正在使用:

    totalPartitions := len(diskInfo.Blockdevices[0].Partitions)
    if totalPartitions > 0 {
        for i := 0; i < totalPartitions; i++ {
            if diskInfo.Blockdevices[0].Partitions[i].Partitions != nil {
                diskInfo.Blockdevices[0].Partitions[i].SubPartitions = true
            } else {
                diskInfo.Blockdevices[0].Partitions[i].SubPartitions = false
            }
        }
    }

但它只能处理1个分区和1个子分区。有什么方法可以遍历每个并为其赋值吗?

由于 SubPartitions 标志与 Partitions 耦合,一种选择是删除 SubPartitions 字段 ,并添加 计算这个值的方法 :

func (p *Partition) HasSubPartitions() bool {
    // note : to check if a slice is empty or not, it is advised to look at
    // 'len(slice)' rather than nil (it is possible to have a non-nil pointer
    // to a 0 length slice)
    return len(p.Partitions) > 0  
}

写一个函数

func markSubPartition(p *Partition) {
if len(p.Partitions) > 0 {
    p.SubPartitions = true
    for _, part := range p.Partitions {
        markSubPartition(part)
    }
} else {
    p.SubPartitions = false
}}

像这样遍历块设备

for _, part := range diskInfo.Blockdevices[0].Partitions {
                markSubPartition(part)}

还需要将结构更改分区字段更改为: 分区[]*分区json:"partitions,omitempty" 希望对你有帮助,谢谢!