我有一个嵌套结构。我想在一个方法中更新它。 由于某些原因,更新不会进行。
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中更新嵌套结构?
答案 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
另请参阅:
答案 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)
}