嵌套结构未更新

时间:2019-01-20 06:46:27

标签: go

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

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

我得到的输出是

{{5}}
{{5}}

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

4 个答案:

答案 0 :(得分:5)

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

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?

答案 1 :(得分:3)

问题在于您的更新功能。您应该将其添加到指向A的指针中。

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

答案 2 :(得分:3)

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

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

请参阅以下内容:

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 :(得分:1)

对于要通过函数更新其对象的任何接口,您需要通过引用传递该对象。

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/_o5sRApo6WP