向量分配是通过值还是通过引用以Google的Go语言复制的?

在下面的代码中,我创建了一个钉子拼图,然后对其进行了移动,从而向其movesAlreadyDone向量添加了移动。然后,我创建另一个钉子拼图,然后对其进行移动,从而向其movesAlreadyDone向量添加一个动作。当我打印出第二个矢量在该向量中的值时,它具有从第一个矢量到第二个矢量的移动。谁能告诉我为什么它似乎是通过引用而不是价值来分配的?向量分配是通过值还是通过引用以Google的Go语言复制的?


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();

}

任何帮助将不胜感激。谢谢!


芜湖不芜
浏览 214回答 2
2回答

qq_笑_17

在您的代码中,movesAlreadyDone是*vector.Vector;; 分配时retVal.movesAlreadyDone = parent.movesAlreadyDone;,您正在复制参考。每当在其中一个上进行矢量修改时,retVal.movesAlreadyDone或者parent.movesAlreadyDone您将修改相同的基础矢量。如果要将一个向量的内容复制到另一个向量,则需要遍历源向量并将其元素推送到目标向量。像这样:for n := range srcVect.Iter() {    dstVect.Push(n);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go