gpt4 book ai didi

vector - 在谷歌的 Go 语言中,向量赋值是按值复制还是按引用复制?

转载 作者:IT王子 更新时间:2023-10-29 02:06:31 25 4
gpt4 key购买 nike

在下面的代码中,我创建了一个钉子拼图,然后对其进行移动,这会向其 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();
}

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

最佳答案

附带的答案,但 vector.New 已从最新版本的 Go 中删除。你需要写

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

在您的原始代码中,您要复制的内容是指向向量的指针。这与 C 中的指针一样。如果您愿意,可以将其称为“通过引用”,但它们是指针。

要复制整个向量,请使用 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
}

这给出了一个完整的唯一副本。

关于vector - 在谷歌的 Go 语言中,向量赋值是按值复制还是按引用复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com