Maison > développement back-end > Golang > Pourquoi ma méthode Go Struct ne modifie-t-elle pas l'objet d'origine ?

Pourquoi ma méthode Go Struct ne modifie-t-elle pas l'objet d'origine ?

DDD
Libérer: 2024-12-18 15:04:11
original
857 Les gens l'ont consulté

Why Does My Go Struct Method Not Modify the Original Object?

Attribuer de nouvelles valeurs aux champs Struct

Considérez le scénario suivant : Une classe Point est définie avec une méthode Move() qui ajuste le x coordonner et une méthode Print() pour afficher les résultats. Cependant, le code présente un comportement inattendu, affichant la valeur x initiale au lieu de celle ajustée après l'appel de Move().

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()
}
Copier après la connexion

Le problème vient du fait que Move() est défini comme un récepteur de valeur, ce qui signifie qu'il fonctionne sur une copie de l'objet Point d'origine. Par conséquent, les modifications apportées à s dans Move() n'ont aucun effet sur l'instance réelle.

Pour résoudre ce problème, la méthode Move() doit être définie comme un récepteur de pointeur, lui permettant d'interagir directement avec l'objet d'origine :

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()
}
Copier après la connexion

Maintenant, lorsque Move() est appelé, la variable s pointe vers l'objet Point d'origine, donc les modifications apportées à s.x affectent directement l'instance. Par conséquent, appeler Print() après Move() affiche correctement la coordonnée x mise à jour.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal