如何编辑埋在递归结构中的数组
How to edit an array that is buried in a recursive struct
我有这个结构(注意它是递归的!):
type Group struct {
Name string
Item []string
Groups []Group
}
我想将一个字符串附加到 Item
数组,该数组深埋在 Group 数组的层次结构中。关于这个新项目的路径,我所掌握的唯一信息是它所在的组的名称。假设路径是 "foo/bar/far"。我想在不覆盖 foo、bar 或 "root" 数组的情况下修改 bar。基本上,我想编写一个函数,该函数 return 是一个与原始变量相同但附加了新字符串的新组变量。
到目前为止我试过以下方法:
遍历包含路径的所有组名称的数组,如果它们在当前组中,则将当前组变量设置为该新组。循环完成后,将字符串附加到数组和 return 当前组。当然,唯一的问题是根组的其余部分被删除并替换为新的修改后的组。
代码:
func in(item string, array []Group) (bool, int) {
for i, elem := range array {
if item == elem.Name {
return true, i
} else {
continue
}
}
return false, 0
}
func addItem(list Group, newItem string, path string) Group {
var currentGroup Group = list
if path == "" {
currentGroup.Items = append(currentGroup.Items, newItem)
} else {
for _, elem := range strings.Split(path, "/") {
in, index := in(elem, currentGroup.Groups)
if in {
currentGroup = currentGroup.Groups[index]
}
}
currentGroup.Items = append(currentGroup.Items, newItem)
}
return currentGroup
}
我想您可以将组作为指针传递给 addItem 函数,并忽略函数的 return 值
有点像
func addItem(list *Group, newItem string, path string) Group {
var currentGroup *Group = list
if path == "" {
currentGroup.Item = append(currentGroup.Item, newItem)
} else {
for _, elem := range strings.Split(path, "/") {
in, index := in(elem, currentGroup.Groups)
if in {
currentGroup = ¤tGroup.Groups[index]
}
}
currentGroup.Item = append(currentGroup.Item, newItem)
}
return *currentGroup
}
我有这个结构(注意它是递归的!):
type Group struct {
Name string
Item []string
Groups []Group
}
我想将一个字符串附加到 Item
数组,该数组深埋在 Group 数组的层次结构中。关于这个新项目的路径,我所掌握的唯一信息是它所在的组的名称。假设路径是 "foo/bar/far"。我想在不覆盖 foo、bar 或 "root" 数组的情况下修改 bar。基本上,我想编写一个函数,该函数 return 是一个与原始变量相同但附加了新字符串的新组变量。
到目前为止我试过以下方法:
遍历包含路径的所有组名称的数组,如果它们在当前组中,则将当前组变量设置为该新组。循环完成后,将字符串附加到数组和 return 当前组。当然,唯一的问题是根组的其余部分被删除并替换为新的修改后的组。
代码:
func in(item string, array []Group) (bool, int) {
for i, elem := range array {
if item == elem.Name {
return true, i
} else {
continue
}
}
return false, 0
}
func addItem(list Group, newItem string, path string) Group {
var currentGroup Group = list
if path == "" {
currentGroup.Items = append(currentGroup.Items, newItem)
} else {
for _, elem := range strings.Split(path, "/") {
in, index := in(elem, currentGroup.Groups)
if in {
currentGroup = currentGroup.Groups[index]
}
}
currentGroup.Items = append(currentGroup.Items, newItem)
}
return currentGroup
}
我想您可以将组作为指针传递给 addItem 函数,并忽略函数的 return 值
有点像
func addItem(list *Group, newItem string, path string) Group {
var currentGroup *Group = list
if path == "" {
currentGroup.Item = append(currentGroup.Item, newItem)
} else {
for _, elem := range strings.Split(path, "/") {
in, index := in(elem, currentGroup.Groups)
if in {
currentGroup = ¤tGroup.Groups[index]
}
}
currentGroup.Item = append(currentGroup.Item, newItem)
}
return *currentGroup
}