Maison > développement back-end > Golang > Comment les récepteurs de pointeurs dans Go impactent-ils la modification de la structure au sein des fonctions ?

Comment les récepteurs de pointeurs dans Go impactent-ils la modification de la structure au sein des fonctions ?

Barbara Streisand
Libérer: 2024-12-23 13:10:21
original
518 Les gens l'ont consulté

How Do Pointer Receivers in Go Impact Struct Modification Within Functions?

Modification des valeurs des champs de structure

Dans Go, lorsqu'une fonction reçoit une structure, elle reçoit généralement une copie de l'objet d'origine. Ainsi, toute modification apportée à la structure au sein de cette fonction n'affectera pas l'objet d'origine.

Considérez l'exemple suivant, où nous définissons une structure Point avec deux champs, x et dx. La méthode Move incrémente x de dx et la méthode Print imprime la valeur de x.

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

Dans ce code, les méthodes Move et Print sont attachées à la structure Point en tant que récepteurs de valeur. Cela signifie que lorsque st est transmis à ces méthodes, une copie de l'objet st original est créée. Toute modification apportée à la copie dans ces méthodes n'affectera pas l'objet st d'origine.

Par conséquent, lorsque nous appelons st.Move(), la copie de st est modifiée, mais l'objet st d'origine reste inchangé. . Par conséquent, lorsque nous imprimons st dans st.Print(), nous voyons toujours la valeur originale de x.

Pour résoudre ce problème, nous devons modifier les méthodes Move et Print pour utiliser des récepteurs de pointeurs au lieu de récepteurs de valeurs. Cela garantit que toute modification apportée à la structure au sein de ces méthodes affectera 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

En utilisant des récepteurs de pointeurs, nous obtenons maintenant le résultat attendu :

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=5
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal