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