Ajout aux propriétés de tranche dans les structures Go
Lorsque vous essayez d'ajouter des valeurs à une propriété de tranche dans une structure Go, vous pouvez rencontrer un comportement inattendu si un ordre d'appel spécifique n'est pas suivi. Cet article explore les raisons de ce problème et propose une solution.
Dans l'exemple de code fourni, trois méthodes sont définies dans différents types de structure pour illustrer le problème. Test1 et Test2 fonctionnent comme prévu car leurs méthodes run() opèrent directement sur la propriété slice. Cependant, dans Test3, la méthode combo() est appelée depuis run() en utilisant un récepteur de valeur au lieu d'un récepteur de pointeur.
Pourquoi un récepteur de pointeur est requis
Dans Go, toutes les valeurs sont transmises par valeur, ce qui signifie qu'une copie de la valeur transmise est créée lors de l'appel d'une fonction ou d'une méthode. Dans le cas de Test3, une copie de la valeur Test3 est effectuée lorsque combo() est appelé, et les modifications apportées à la propriété slice dans cette copie ne sont pas reflétées dans la structure Test3 d'origine.
En utilisant un récepteur de pointeur , comme func (c *Test3) combo(), la structure Test3 originale est directement modifiée, éliminant le problème de copie locale changements.
Solution
La solution consiste à changer le type de récepteur de la méthode combo() en un récepteur pointeur. Cela garantit que la structure Test3 d'origine est modifiée par la méthode.
Code mis à jour
package main import ( "fmt" ) type Test1 struct { all []int } func (c Test1) run() []int { for i := 0; i < 2; i++ { c.all = append(c.all, i) } return c.all } var gloabl_all []int type Test2 struct {} func (c Test2) run() []int { c.combo() return gloabl_all } func (c Test2) combo() { for i := 0; i < 2; i++ { gloabl_all = append(gloabl_all, i) } } type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } } func main() { test1 := &Test1{} fmt.Println("Test1 final:", test1.run()) test2 := &Test2{} fmt.Println("Test2 final:", test2.run()) test3 := &Test3{} fmt.Println("Test3 final:", test3.run()) }
Sortie
Test1 final: [0 1] Test2 final: [0 1] Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: [0 1]
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!