英文:
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"`
}
现在,一个块设备中可以有多个分区,而一个分区中又可以有更多的子分区。我想手动为分区结构体中的字段赋值。我该如何做到这一点?我该如何迭代每个分区和子分区,并为其赋值?有没有办法可以做到这一点?
目前我使用的代码只能处理一个分区和一个子分区。有没有办法可以迭代每个分区并为其赋值?
英文:
I have created a dynamic struct to unmarshal a JSON.
Struct looks like :
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"`
}
Now there can be many partitions inside block devices, and a partition can have more sub partitions in it. I want to manually assign value to a field in partition struct. How can i do that.
How can i iterate over each partition and sub partitions and assign a manual value to it.
Is there any way to do this ?
Currently using this :
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
}
}
}
But it can only handle 1 partition with one sub partition. Is there any way i can iterate over each and assign value to it?
答案1
得分: 1
由于SubPartitions
标志与Partitions
相关联,一种选择是删除SubPartitions
字段,并添加一个计算该值的方法:
func (p *Partition) HasSubPartitions() bool {
// 注意:要检查切片是否为空,建议查看`len(slice)`而不是`nil`(可能存在非nil指针指向长度为0的切片)
return len(p.Partitions) > 0
}
英文:
Since that SubPartitions
flag is coupled with Partitions
, one option is to remove the SubPartitions
field, and add a method that computes this value :
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
}
答案2
得分: 1
写一个函数
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)
}
还需要修改你的结构体,将partition
字段更改为:
Partitions []*Partition `json:"partitions,omitempty"`
希望对你有所帮助,谢谢!
英文:
Write a function
func markSubPartition(p *Partition) {
if len(p.Partitions) > 0 {
p.SubPartitions = true
for _, part := range p.Partitions {
markSubPartition(part)
}
} else {
p.SubPartitions = false
}}
And loop over blockdevices like this
for _, part := range diskInfo.Blockdevices[0].Partitions {
markSubPartition(part)}
Also need to alter your struct change partition field to :
Partitions []*Partition json:"partitions,omitempty"
Hope it helps, Thanks!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论