Les assignations de vecteurs sont-elles copiées par valeur ou par référence dans la langue Google de Google?

StackOverflow https://stackoverflow.com/questions/1806673

  •  05-07-2019
  •  | 
  •  

Question

Dans le code suivant, je crée un casse-tête, puis je le déplace, ce qui ajoute un coup au vecteur moveAlreadyDone. Ensuite, je crée un autre casse-tête, puis fais un geste dessus, qui ajoute un coup au vecteur moveAlreadyDone. Lorsque j'imprime les valeurs de ce vecteur pour le second, il y a le déplacement du premier et le déplacement du second. Quelqu'un peut-il me dire pourquoi il semble attribuer par référence et non valeur? Les assignations de vecteurs sont-elles copiées par valeur ou par référence dans la langue Google de Google?

package main

import "fmt"
import "container/vector"

type Move struct { x0, y0, x1, y1 int }

type PegPuzzle struct {
    movesAlreadyDone * vector.Vector;
}

func (p *PegPuzzle) InitPegPuzzle(){
    p.movesAlreadyDone = vector.New(0);
}

func NewChildPegPuzzle(parent *PegPuzzle) *PegPuzzle{
    retVal := new(PegPuzzle);
    retVal.movesAlreadyDone = parent.movesAlreadyDone;
    return retVal
}

func (p *PegPuzzle) doMove(move Move){
    p.movesAlreadyDone.Push(move);
}

func (p *PegPuzzle) printPuzzleInfo(){
    fmt.Printf("-----------START----------------------\n");
    fmt.Printf("moves already done: %v\n", p.movesAlreadyDone);
    fmt.Printf("------------END-----------------------\n");
}

func main() {
    p := new(PegPuzzle);
    cp1 := new(PegPuzzle);
    cp2 := new(PegPuzzle);

    p.InitPegPuzzle();

    cp1 = NewChildPegPuzzle(p);
    cp1.doMove(Move{1,1,2,3});
    cp1.printPuzzleInfo();

    cp2 = NewChildPegPuzzle(p);
    cp2.doMove(Move{3,2,5,1});
    cp2.printPuzzleInfo();
}

Toute aide sera grandement appréciée. Merci!

Était-ce utile?

La solution

Incident dans la réponse, mais vector.New a été supprimé des versions récentes de Go. Vous devez écrire

func (p *PegPuzzle) InitPegPuzzle(){
    p.movesAlreadyDone = new (vector.Vector);
}

Dans votre code d'origine, les éléments que vous copiez sont des pointeurs sur des vecteurs. C’est la même chose que les pointeurs de C. Vous pouvez l’appeler "par référence". si vous aimez, mais ce sont des pointeurs.

Pour copier un vecteur entier, utilisez InsertVector :

func (p *PegPuzzle) InitPegPuzzle(){
    p.movesAlreadyDone = new (vector.Vector);
}

func NewChildPegPuzzle(parent *PegPuzzle) *PegPuzzle{
    retVal := new (PegPuzzle);
    retVal.InitPegPuzzle ();
    retVal.movesAlreadyDone.InsertVector (0, parent.movesAlreadyDone);
    return retVal
}

Ceci donne une copie unique complète.

Autres conseils

Dans votre code, moveAlreadyDone est un * vector.Vector ; lorsque vous affectez retVal.movesAlreadyDone = parent.movesAlreadyDone; , vous copiez une référence. Chaque fois qu'une modification de vecteur est effectuée sur retVal.movesAlreadyDone ou parent.movesAlreadyDone , vous modifiez le même vecteur sous-jacent.

Si vous souhaitez copier le contenu d'un vecteur dans un autre, vous devez parcourir le vecteur source et en insérer les éléments dans le vecteur de destination. Comme si:

for n := range srcVect.Iter() {
    dstVect.Push(n);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top