Maison >développement back-end >Golang >Pourquoi la modification d'un champ Go Struct dans une méthode de réception de valeur ne modifie-t-elle pas la valeur d'origine ?

Pourquoi la modification d'un champ Go Struct dans une méthode de réception de valeur ne modifie-t-elle pas la valeur d'origine ?

DDD
DDDoriginal
2024-12-15 17:16:18122parcourir

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn