如何以递归方式更新结构切片

对于以下代码,我期待输出,{"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)

}


跃然一笑
浏览 204回答 3
3回答

天涯尽头无女友

您不需要按照其他答案的建议在任何地方使用指针。代码中的问题是,当您迭代子项时,您会通过副本为每个项目获取一个值,然后在副本上设置名称。但是由于您没有将修改后的值复制回切片中,因此不会保留更改。package mainimport (    "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)}

Helenr

您可以通过更改Child []red为指针列表来做到这一点:Child []*red.这是Go 游乐场的完整代码package mainimport (    "fmt")type red struct {    Name string    Child []*red}func (r *red) setName(s string){    r.Name = s    for _, ch := range r.Child{        ch.setName(s)    }}func main() {    obj := red{Name:"A",Child:[]*red{&red{Name: "B"}}}    fmt.Println(obj.Name)    for _, ch := range obj.Child{       fmt.Println(ch.Name)    }    fmt.Print("\n")    obj.setName("X")    //Expectation X \n X    fmt.Println(obj.Name)    for _, ch := range obj.Child{       fmt.Println(ch.Name)    }}

慕桂英546537

其实问题就在这里for _, ch := range r.Child{        ch.setName(s)}您正在使用更新,实际上ch并没有更新您的r.Child切片。你的代码是这样的var ch redfor i, _:= range r.Child{    ch = r.Child[i]    ch.setName(s)}要解决此问题,您可以通过这种方式更新切片。for i, _ := range r.Child {    r.Child[i].setName(s) // access the slice eliment by index and update}这是一个很好[]*red的儿童模式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go