首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未更新嵌套结构

未更新嵌套结构
EN

Stack Overflow用户
提问于 2019-01-20 14:46:27
回答 4查看 1.2K关注 0票数 3

我有一个嵌套的结构。我想在一个方法中更新它。由于某些原因,更新无法进行。

代码语言:javascript
复制
    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)
    }

我得到的输出是

代码语言:javascript
复制
{{5}}
{{5}}

在大多数语言中,我希望它会更新。这是什么特殊的Go行为吗?如何更新Go中的嵌套结构?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-20 14:57:13

这是因为您使用的是值接收器,所以updateB方法接收A值的副本,而不是指向包含a变量的内存的指针。使用指针接收器可以解决这个问题:

代码语言:javascript
复制
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

另请参阅:

Value receiver vs. Pointer receiver in Golang?

票数 5
EN

Stack Overflow用户

发布于 2019-01-20 14:56:33

问题出在更新函数上。您应该将其添加到指向A的指针中。

代码语言:javascript
复制
func (a *A) updateB(n int) {
    a.b.c = n
}
票数 3
EN

Stack Overflow用户

发布于 2019-01-20 14:57:34

这并不是因为结构是嵌套的,而是因为您需要一个指针接收器来修改接收器指向的值,在本例中是您的a变量。

如果没有指针,您的UpdateB方法将只更新原始A struct值的副本。

请参阅以下内容:

代码语言:javascript
复制
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(50)
    fmt.Println(a)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54274225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档