3 回答

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

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

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的兒童模式。
- 3 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報(bào)