在 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"
希望对你有帮助,谢谢!
我创建了一个动态结构来解组 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"
希望对你有帮助,谢谢!