我有一个嵌套的结构.我想在方法中更新它.出于某种原因,更新不会发生.
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中更新嵌套结构?
这是因为您正在使用值接收器,因此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
也可以看看: