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
DDDoriginal
2025-01-03 10:15:39516parcourir

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

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

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!

Déclaration:
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