为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
芜湖不芜 2021-04-16 14:15:21
在下面的代码中,我创建了一个钉子拼图,然后对其进行了移动,从而向其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);

}


查看完整回答
反对 回复 2021-04-26
  • 2 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信