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
DDDoriginal
2024-12-18 15:04:11849parcourir

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()
}

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()
}

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!

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