在下面的代码中,我创建了一个钉子拼图,然后对其进行了移动,从而向其movesAlreadyDone向量添加了移动。然后,我创建另一个钉子拼图,然后对其进行移动,从而向其movesAlreadyDone向量添加一个动作。当我打印出第二个矢量在该向量中的值时,它具有从第一个矢量到第二个矢量的移动。谁能告诉我为什么它似乎是通过引用而不是价值来分配的?向量分配是通过值还是通过引用以Google的Go语言复制的?package mainimport "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();}任何帮助将不胜感激。谢谢!
2 回答
qq_笑_17
TA贡献1818条经验 获得超7个赞
在您的代码中,movesAlreadyDone是*vector.Vector;; 分配时retVal.movesAlreadyDone = parent.movesAlreadyDone;,您正在复制参考。每当在其中一个上进行矢量修改时,retVal.movesAlreadyDone或者parent.movesAlreadyDone您将修改相同的基础矢量。
如果要将一个向量的内容复制到另一个向量,则需要遍历源向量并将其元素推送到目标向量。像这样:
for n := range srcVect.Iter() {
dstVect.Push(n);
}
- 2 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消