第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何以遞歸方式更新結(jié)構(gòu)切片

如何以遞歸方式更新結(jié)構(gòu)切片

Go
躍然一笑 2022-06-06 17:40:19
對(duì)于以下代碼,我期待輸出,{"NewName" [{"NewName" []}]}但它不會(huì)更新子結(jié)構(gòu)。我們?nèi)绾未_保它更新層次結(jié)構(gòu)中的每個(gè)結(jié)構(gòu)。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 回答

?
天涯盡頭無(wú)女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

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


代碼中的問(wèn)題是,當(dāng)您迭代子項(xiàng)時(shí),您會(huì)通過(guò)副本為每個(gè)項(xiàng)目獲取一個(gè)值,然后在副本上設(shè)置名稱(chēng)。


但是由于您沒(méi)有將修改后的值復(fù)制回切片中,因此不會(huì)保留更改。


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)

}


查看完整回答
反對(duì) 回復(fù) 2022-06-06
?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以通過(guò)更改Child []red為指針列表來(lái)做到這一點(diǎn):Child []*red.


這是Go 游樂(lè)場(chǎng)的完整代碼


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)

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-06-06
?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊

其實(shí)問(wèn)題就在這里


for _, ch := range r.Child{

        ch.setName(s)

}

您正在使用更新,實(shí)際上ch并沒(méi)有更新您的r.Child切片。你的代碼是這樣的


var ch red

for i, _:= range r.Child{

    ch = r.Child[i]

    ch.setName(s)

}

要解決此問(wèn)題,您可以通過(guò)這種方式更新切片。


for i, _ := range r.Child {

    r.Child[i].setName(s) // access the slice eliment by index and update

}

這是一個(gè)很好[]*red的兒童模式。


查看完整回答
反對(duì) 回復(fù) 2022-06-06
  • 3 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)