Maison > développement back-end > Golang > Pourquoi ai-je besoin d'un récepteur de pointeur à ajouter à une tranche dans une structure Go ?

Pourquoi ai-je besoin d'un récepteur de pointeur à ajouter à une tranche dans une structure Go ?

Mary-Kate Olsen
Libérer: 2024-12-27 17:39:12
original
258 Les gens l'ont consulté

Why Do I Need a Pointer Receiver to Append to a Slice in a Go Struct?

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

Sortie

Test1 final: [0 1]
Test2 final: [0 1]
Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: [0 1]
Copier après la connexion

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