首页 > 解决方案 > 在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 个分区和一个子分区。有什么方法可以遍历每个并为其赋值?

标签: loopsgostructdynamic

解决方案


写一个函数

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)}

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


推荐阅读