我有一个嵌套的结构。我想在一个方法中更新它。由于某些原因,更新无法进行。
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中的嵌套结构?
发布于 2019-01-20 14:57:13
这是因为您使用的是值接收器,所以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
另请参阅:
发布于 2019-01-20 14:56:33
问题出在更新函数上。您应该将其添加到指向A的指针中。
func (a *A) updateB(n int) {
a.b.c = n
}发布于 2019-01-20 14:57:34
这并不是因为结构是嵌套的,而是因为您需要一个指针接收器来修改接收器指向的值,在本例中是您的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)
}https://stackoverflow.com/questions/54274225
复制相似问题