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 ?

Pourquoi l'ajout à une tranche de structure ne fonctionne-t-il pas lors d'un appel à partir d'une autre méthode ?

Linda Hamilton
Libérer: 2024-12-19 13:08:14
original
286 Les gens l'ont consulté

Why Doesn't Appending to a Struct Slice Work in Go When Called From Another Method?

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

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

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

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!

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