Vector 向量赋值是通过值复制还是通过引用复制到Google';什么是围棋语言?
在下面的代码中,我创建了一个peg拼图,然后对其进行移动,从而将移动添加到其MovesReadyDone向量中。然后我创建另一个peg拼图,然后在上面做一个移动,将移动添加到它的MovesReadyDone向量中。当我打印出第二个向量中的值时,它有从第一个向量开始的移动,以及从第二个向量开始的移动。有人能告诉我为什么它看起来是通过引用而不是值赋值的吗?在谷歌的Go语言中,向量赋值是按值复制还是按引用复制Vector 向量赋值是通过值复制还是通过引用复制到Google';什么是围棋语言?,vector,go,Vector,Go,在下面的代码中,我创建了一个peg拼图,然后对其进行移动,从而将移动添加到其MovesReadyDone向量中。然后我创建另一个peg拼图,然后在上面做一个移动,将移动添加到它的MovesReadyDone向量中。当我打印出第二个向量中的值时,它有从第一个向量开始的移动,以及从第二个向量开始的移动。有人能告诉我为什么它看起来是通过引用而不是值赋值的吗?在谷歌的Go语言中,向量赋值是按值复制还是按引用复制 package main import "fmt" import "container/v
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();
}
任何帮助都将不胜感激。谢谢 在您的代码中,
movesareadydone
是一个*向量;分配retVal.movesAlreadyDone=parent.movesAlreadyDone时代码>,您正在复制引用。无论何时对retVal.movesalereadydone
或parent.movesalereadydone
执行向量修改,都将修改相同的基础向量
如果要将一个向量的内容复制到另一个向量,则需要迭代源向量并将其元素推送到目标向量。像这样:
for n := range srcVect.Iter() {
dstVect.Push(n);
}
答案附带,但矢量。新的
已从Go的最新版本中删除。你需要写作
func (p *PegPuzzle) InitPegPuzzle(){
p.movesAlreadyDone = new (vector.Vector);
}
在原始代码中,要复制的内容是指向向量的指针。这与C中的指针相同。如果您愿意,可以将其称为“通过引用”,但它们是指针
要复制整个向量,请使用:
这提供了一个完整的唯一副本。无需迭代-只需调用Vector.AppendVector即可。
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
}