为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
跃然一笑 2022-06-06 17:40:19
对于以下代码,我期待输出,{"NewName" [{"NewName" []}]}但它不会更新子结构。我们如何确保它更新层次结构中的每个结构。package mainimport (    "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)}
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您不需要按照其他答案的建议在任何地方使用指针。


代码中的问题是,当您迭代子项时,您会通过副本为每个项目获取一个值,然后在副本上设置名称。


但是由于您没有将修改后的值复制回切片中,因此不会保留更改。


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)

}


查看完整回答
反对 回复 2022-06-06
?
Helenr

TA贡献1780条经验 获得超4个赞

您可以通过更改Child []red为指针列表来做到这一点:Child []*red.


这是Go 游乐场的完整代码


package main


import (

    "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)

    }

}


查看完整回答
反对 回复 2022-06-06
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

其实问题就在这里


for _, ch := range r.Child{

        ch.setName(s)

}

您正在使用更新,实际上ch并没有更新您的r.Child切片。你的代码是这样的


var ch red

for 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的儿童模式。


查看完整回答
反对 回复 2022-06-06
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号