Maison >développement back-end >Golang >Pourquoi ma méthode Go Struct ne modifie-t-elle pas l'objet d'origine ?
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!