Maison > développement back-end > Golang > Comment modifier correctement les champs Struct dans Go ?

Comment modifier correctement les champs Struct dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-17 17:58:10
original
221 Les gens l'ont consulté

How to Correctly Modify Struct Fields in Go?

Attribuer de nouvelles valeurs aux champs Struct dans Go

Dans Go, les structures sont couramment utilisées pour encapsuler les données associées et fournir un ensemble de méthodes pour manipuler leurs champs. Cependant, un problème courant rencontré lorsque l'on travaille avec des champs de structure est de modifier correctement leurs valeurs.

Dans l'exemple ci-dessous, une structure nommée Point est créée avec deux champs, x et dx. Deux méthodes, Move() et Print(), sont définies pour modifier et afficher le champ x, respectivement.

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

Dans main(), une nouvelle instance de Point est créée avec les valeurs par défaut x=3 et dx=2. Les méthodes Move() et Print() sont appelées, dans l'espoir que la valeur du champ x soit modifiée pendant Move() et que la sortie Print() reflète la valeur mise à jour (Final x=5). Cependant, le résultat réel est le suivant :

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

Ce comportement inattendu se produit car le récepteur des deux méthodes est défini comme un récepteur de valeur (c'est-à-dire un Point) au lieu d'un récepteur de pointeur (*Point). Dans Go, lorsqu'une valeur est transmise à une méthode avec un récepteur de valeur, une copie de cette valeur est créée dans la méthode et toute modification apportée aux champs de cette copie n'affecte pas la valeur d'origine.

Pour résoudre ce problème et modifier la structure d'origine, un récepteur de pointeur doit être utilisé dans les deux méthodes. Cela garantit que les méthodes fonctionnent directement sur la structure d'origine et que toutes les modifications apportées à celles-ci sont reflétées dans l'instance 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)
}
Copier après la connexion

Avec cette modification, la méthode Move() met correctement à jour le champ x et le La méthode Print() génère la valeur 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
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