go - 如何以递归方式更新结构 slice

标签 go recursion struct slice

对于以下代码,我期望输出 {"NewName" [{"NewName" []}]}但它没有更新子结构。我们如何确保它更新层次结构中的每个结构。

package main

import (
    "fmt"
)

type red struct {
    Name string
    Child []red
}

func (r *red) setName(nameString string){
    r.Name = nameString
    for _, child := range r.Child{
        child.setName(nameString)
    }
}

func main() {
    obj := red{Name:"NameA",Child:[]red{red{Name: "NameB"}}}
    fmt.Print(obj)
    fmt.Print("\n")

    obj.setName("NewName")
    //Expectation {"NewName" [{"NewName" []}]}
    fmt.Print(obj)
}

最佳答案

您不需要像其他人的答案所建议的那样到处使用指针。您的代码中的问题是当您迭代子项时,您会获得每个副本的值,在此副本上设置名称,但不要将该副本保存到 slice 中。

package main

import (
    "fmt"
)

type red struct {
    Name  string
    Child []red
}

func (r *red) setName(s string) {
    r.Name = s
    for i, ch := range r.Child {
        ch.setName(s) // ch is not a ptr to r.Child[i], it is a value copy
        r.Child[i] = ch // so you must re assign the copy into the slice!
    }
}

func main() {
    obj := red{Name: "A", Child: []red{red{Name: "B"}}}
    fmt.Print(obj)
    fmt.Print("\n")

    obj.setName("X")
    //Expectation {X [{X []}]}
    fmt.Print(obj)
}

关于go - 如何以递归方式更新结构 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62164402/

相关文章:

go - 为什么 map 不返回它的值?

递归爬楼梯拼图的 Java 基准测试

c# - 从结构体的 ArrayList 获取参数

json - Golang 解码 json 列表

go - 如何从源代码手动安装 Go 包

go - 通过 channel 在 Go 中进行通信

c# - 生成站点地图的递归算法

Python:清理我的列表以供重用(斐波那契示例)

java - 通过 JNI 将 C++ 类返回给 Java

c - 关于 C 中结构的奇怪输出