我试图创建一个结构板的浅拷贝(棋盘)。 保存移动到板之前,我需要检查,如果这一举动使推进器的检查。
要做到这一点,Move方法中(指针的方法),我取的指针,更新和检查这个可能的董事会检查。 当我改变板类型的单个值的值(如possible.headers = "Possible Varient"
)的原b
板不被改变。
但在这里,当我调用一个方法updateBoard()将更新双方董事会。 我仍然收到错误(不能进入检查),但主线程自以为b.board
(板位置)已经改变。
func (b *Board) Move(orig, dest int) error {
// validation
...
// Update
possible := *b // A 'shallow copy'?
possible.updateBoard(orig, dest, val, isEmpassant, isCastle)
king := possible.findKingPositionOfThePlayerWhoMoved()
isCheck := possible.isInCheck(king) // bool takes the king to check for
if isCheck {
return errors.New("Cannot move into Check")
}
b.updateBoard(orig, dest, val, empassant, isCastle)
return nil
奇怪的是,并非所有的由更新的值updateBoard()
的变化。 所以b.toMove
值不会改变,但b.board
值确实(件的位置)。 这意味着,如果我通过possible := b
代替,游戏将永远只能是白色的举动(toMove在updateBoard()方法交替)。 有了possible := *b
,把工作轮换,直到一个移动到检查。 然后,此举被应用到b.board
,但误差后仰,它仍然在签球员转(指possible.updateBoard()
没有更新b.toMove。
编辑
作为abhink指出,在围棋片的使用和内部 ,
切片不会复制切片的数据。 它创建一个指向原始数组新的切片值。
b.board
,一个[]byte
,总是指向其原始值(即使其持有该结构被取消引用 。abhink的答案使用转到func copy(dst, src []Type) int
, https://golang.org /包装/内建/#拷贝 ,用于复制指针的值的快捷方式。