嵌套结构未更新

use*_*323 3 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)
    }
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

{{5}}
{{5}}
Run Code Online (Sandbox Code Playgroud)

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

Iai*_*can 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)
}
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:

Golang中的值接收器与指针接收器?