Attribuer une nouvelle valeur à un champ Struct
Dans Go, lorsqu'on traite des structures, il est important de comprendre le concept de récepteurs de valeur par rapport à récepteurs de pointeurs. Un récepteur de valeur opère sur une copie de la valeur d'origine, tandis qu'un récepteur de pointeur opère directement sur la valeur d'origine.
Considérez cet extrait de code, où la question est soulevée à propos des valeurs de champ de structure inchangées de manière inattendue :
type Point struct { x, dx int } func (s Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
On s'attend à ce que la méthode Move() modifie le champ x de la structure Point, ce qui devrait être reflété dans la méthode Print(). Cependant, la sortie montre que le champ x reste inchangé.
La solution : utiliser des récepteurs de pointeurs
Le problème réside dans l'utilisation d'un récepteur de valeur dans le Move( ) et Print(). Dans Go, tout est passé par valeur, ce qui signifie qu'une copie de la valeur originale est créée lors du passage d'une structure à une fonction. Par conséquent, toute modification apportée à la copie au sein de la fonction n'affecte pas la valeur d'origine.
Pour résoudre ce problème, nous devons utiliser des récepteurs de pointeurs. Un récepteur pointeur permet à la fonction d'opérer directement sur la valeur d'origine. Voici le code corrigé :
type Point struct { x, dx int } func (s *Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s *Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
En utilisant un récepteur de pointeur pour les méthodes Move() et Print(), nous opérons désormais directement sur la structure Point d'origine, et les modifications apportées au champ x sont reflétées correctement .
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!