J'ai une structure imbriquée. Je veux le mettre à jour dans une méthode. Pour une raison quelconque, la mise à jour n'a pas lieu.
{{5}}
{{5}}
Le résultat que j'obtiens est
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)
}
Dans la plupart des langues, je m'attendrais à ce qu'il soit mis à jour. S'agit-il d'un comportement Go spécial? Comment mettre à jour les structures imbriquées dans Go?
4 Réponses :
Le problème vient de votre fonction de mise à jour. Vous êtes censé l'ajouter au pointeur vers A.
func (a *A) updateB(n int) {
a.b.c = n
}
C'est parce que vous utilisez un récepteur de valeur donc la méthode updateB reçoit une copie de la valeur de A plutôt qu'un pointeur vers la mémoire qui contient la variable a . L'utilisation d'un récepteur de pointeur résout le problème:
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
Voir aussi:
Ce n'est pas parce que la structure est imbriquée, c'est plutôt parce que vous avez besoin d'un récepteur de pointeur pour modifier la valeur vers laquelle pointe le récepteur, dans ce cas votre variable a .
Sans le pointeur, votre méthode UpdateB ne mettrait à jour qu'une copie de la valeur de structure A d'origine.
Voir ce qui suit:
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)
}
Pour que toute interface pour ses objets soit mise à jour par une fonction, vous devez passer l'objet par référence.
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)
}