Maison >développement back-end >Golang >Pourquoi l'ajout à une tranche de structure ne fonctionne-t-il pas lors d'un appel à partir d'une autre méthode ?
Impossible d'ajouter à une tranche Struct en dehors de la méthode
Lorsque vous travaillez avec des tranches dans Go, un problème courant survient lors de l'ajout à une tranche qui est une propriété d'une structure. Dans certains scénarios, cette opération peut échouer même si elle fonctionne correctement lorsqu'elle est effectuée directement sur la structure.
Considérez l'exemple suivant :
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 }
Ici, le code s'ajoute avec succès à la tranche all dans le méthode run de la structure Test1. Cependant, si cette méthode appelle une autre méthode, l'opération d'ajout échoue.
Par exemple :
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) } }
Dans ce scénario, la méthode Test3.combo tente d'ajouter à la tranche all mais échoue . La raison en est que Go transmet les valeurs par valeur, ce qui signifie qu'une copie de la structure Test3 est créée lorsque c.combo() est appelée.
La copie opère sur sa propre tranche, et lorsque la méthode revient, les modifications associées sont ignorées. Par conséquent, lorsque Test3.run essaie de renvoyer c.all, il renvoie une tranche vide car la version modifiée de la copie est perdue.
La solution à ce problème consiste à utiliser un récepteur de pointeur pour la méthode combo :
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) } }
L'utilisation d'un récepteur de pointeur garantit que la méthode fonctionne sur la structure Test3 d'origine, permettant ainsi de conserver les modifications apportées dans la méthode combo à son retour.
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!