Maison >développement back-end >Golang >Pourquoi la modification du champ d'une structure Go dans une méthode de réception de valeur ne persiste-t-elle pas ?
Modification des structures via des récepteurs de valeurs : comprendre l'effet d'ombrage
En Go, le comportement des récepteurs de méthodes peut avoir un impact profond sur la mutabilité de structures. Comprendre la différence entre les récepteurs de valeurs et les récepteurs de pointeurs est crucial pour manipuler correctement les structures.
Contexte du problème
L'exemple fourni démontre un comportement apparemment inattendu. Le champ d'une structure est modifié au sein d'une méthode, mais la modification ne persiste pas en dehors de la méthode.
type Test struct { someStrings []string } func (this Test) AddString(s string) { this.someStrings = append(this.someStrings, s) this.Count() // will print "1" } func (this Test) Count() { fmt.Println(len(this.someStrings)) }
Lorsque ce code est exécuté, il affiche :
1 0
Ce comportement se produit car la méthode AddString utilise un récepteur de valeur, qui crée essentiellement une copie de la structure lorsque la méthode est invoquée. Les modifications apportées dans la méthode sont appliquées à cette copie, et non à la structure originale. Par conséquent, lorsque Count est invoqué en dehors de la méthode, il opère sur la structure d'origine non modifiée.
Récepteurs de pointeur vs récepteurs de valeur
Pour résoudre ce problème, un pointeur Le récepteur doit être utilisé à la place d’un récepteur de valeur. Les récepteurs pointeurs créent une référence à la structure d'origine, permettant une manipulation directe.
func (t *Test) AddString(s string) { t.someStrings = append(t.someStrings, s) t.Count() // will print "1" }
Avec un récepteur pointeur, la méthode AddString opère directement sur la structure du récepteur. La modification de someStrings est ainsi reflétée dans la structure originale. Par conséquent, lorsque Count est invoqué en dehors de la méthode, il opère sur la structure modifiée.
Conclusion
En comprenant la différence entre les récepteurs de valeurs et les récepteurs de pointeurs, vous peut manipuler efficacement les structures dans Go. Les récepteurs de valeur créent des copies, tandis que les récepteurs de pointeurs fournissent un accès direct à la structure d'origine. Cette nuance est cruciale pour garantir que les changements apportés au sein des méthodes sont persistants en dehors de ces méthodes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!