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

追加内容以切片到嵌套结构中不起作用

追加内容以切片到嵌套结构中不起作用

Go
慕慕森 2022-09-19 10:08:21
我有两个嵌套结构,如下所示:type Block struct {    ID       string    Contents []string}type Package struct {    Name   string    Blocks []Block}当我尝试在特定块中追加新内容时,原始包 () 不会更改。pfor _, b := range p.Blocks {    if b.ID == "B1" {        fmt.Println("Adding a new content")        b.Contents = append(b.Contents, "c3")    }}例:https://play.golang.org/p/5hm6RjPFk8o
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

发生这种情况是因为以下行:

for _, b := range p.Blocks {

创建切片中每个副本的副本。因此,当您在循环体中进行更改时,您将对 的副本进行更改,而不是对切片中的 进行更改。BlockBlockBlock

如果您改用索引来获取指向每个 的指针,例如Block

for i := range p.Blocks {
    b := &p.Blocks[i]

它按预期工作:

https://play.golang.org/p/h_nXEX9oWRT


查看完整回答
反对 回复 2022-09-19
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

在切片上循环时,从切片中检索到的每个单个值都是切片中相应元素的副本。因此,要修改切片中的元素,而不是副本,可以使用索引表达式直接访问元素。或者您可以使用指针。请注意,也会复制指针,但复制的指针将指向与切片中的元素相同的地址,因此可用于直接修改相同的数据。


您可以使用索引:


for i := range p.Blocks {

    if p.Blocks[i].ID == "B1" {

        fmt.Println("Adding a new content")

        p.Blocks[i].Contents = append(p.Blocks[i].Contents, "c3")

    }

}

https://play.golang.org/p/di175k18YQ9


或者您可以使用指针:


type Block struct {

    ID       string

    Contents []string

}


type Package struct {

    Name   string

    Blocks []*Block

}


for _, b := range p.Blocks {

    if b.ID == "B1" {

        fmt.Println("Adding a new content")

        b.Contents = append(b.Contents, "c3")

    }

}

https://play.golang.org/p/1RjWlCZkhYv


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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