在下面的代碼中,我創(chuàng)建了一個釘子拼圖,然后對其進行了移動,從而向其movesAlreadyDone向量添加了移動。然后,我創(chuàng)建另一個釘子拼圖,然后對其進行移動,從而向其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條經(jīng)驗 獲得超7個贊
在您的代碼中,movesAlreadyDone是*vector.Vector;; 分配時retVal.movesAlreadyDone = parent.movesAlreadyDone;,您正在復制參考。每當在其中一個上進行矢量修改時,retVal.movesAlreadyDone或者parent.movesAlreadyDone您將修改相同的基礎矢量。
如果要將一個向量的內(nèi)容復制到另一個向量,則需要遍歷源向量并將其元素推送到目標向量。像這樣:
for n := range srcVect.Iter() {
dstVect.Push(n);
}
- 2 回答
- 0 關注
- 234 瀏覽
添加回答
舉報
0/150
提交
取消