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)
}
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)
}
}
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的儿童模式。
- 3 回答
- 0 关注
- 203 浏览
添加回答
举报
