Maison > développement back-end > Golang > Pourquoi l'ajout à une tranche dans une méthode Go Struct ne fonctionne-t-il pas toujours ?

Pourquoi l'ajout à une tranche dans une méthode Go Struct ne fonctionne-t-il pas toujours ?

DDD
Libérer: 2025-01-03 10:15:39
original
510 Les gens l'ont consulté

Why Doesn't Appending to a Slice in a Go Struct Method Always Work?

Comprendre la manipulation des tranches dans Go

Dans Go, lors de la manipulation de tranches en tant que propriétés de structures, il est crucial de considérer le passage de valeur. Dans certaines situations, l’ajout à une tranche au sein d’une méthode peut sembler échouer. Examinons les raisons derrière cela et explorons une solution.

Transmission de valeur dans Go Structs

Dans Go, tout est transmis par valeur, ce qui signifie qu'une copie est créée pour chaque valeur transmise. Par conséquent, toute modification apportée à la copie au sein d'une méthode n'affectera pas la valeur d'origine.

Test3 : une tentative d'ajout échouée

Considérez le code suivant :

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

Lorsque vous appelez Test3.run(), il apparaît que c.all n'est pas modifié. En effet, la méthode combo() fonctionne sur une copie de Test3 et toutes les modifications apportées dans combo() ne sont pas propagées à la valeur d'origine.

Solution : utilisation de récepteurs de pointeurs

Pour résoudre ce problème, utilisez un récepteur pointeur pour la méthode combo() :

func (c *Test3) combo() {
  for i := 0; i < 2; i++ {
    c.all = append(c.all, i)
    fmt.Println("Test3 step", i + 1, c.all)
  }
}
Copier après la connexion

En utilisant un récepteur pointeur, vous vous assurez que combo() modifie la valeur Test3 d'origine et les modifications sont reflétées au retour de la méthode.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal