dongshanya2008 2019-01-20 06:46
浏览 20
已采纳

嵌套结构未更新

I have a nested struct. I want to update it inside a method. For some reason, the update doesn't take place.

    package main

    import "fmt"

    type B struct {
        c int
    }

    type A struct {
        b B
    }

    func (a A) updateB(n int) {
        a.b.c = n
    }

    func main() {
        a := A{b: B{c: 5}}

        fmt.Println(a)
        a.updateB(42)
        fmt.Println(a)
    }

The output I get is

{{5}}
{{5}}

In most languages, I'd expect it to be updated. Is this some special Go behavior? How does one go about updating nested structs in Go?

  • 写回答

4条回答 默认 最新

  • dongye9820 2019-01-20 06:57
    关注

    It is because you are using a value receiver so the updateB method receives a copy of the value of A rather than a pointer to the memory that contains the a variable. Using a pointer receiver fixes the problem:

    package main
    
    import "fmt"
    
    type B struct {
        c int
    }
    
    type A struct {
        b B
    }
    
    func (a *A) updateB(n int) {
        a.b.c = n
    }
    
    func main() {
        a := A{b: B{c: 5}}
    
        fmt.Println(a)
        a.updateB(42)
        fmt.Println(a)
    }
    

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

    See also:

    Value receiver vs. Pointer receiver in Golang?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)