登录
首页 >  Golang >  Go问答

修改取消引用的结构指针会更改大多数结构值,但不会更改切片

来源:Golang技术栈

时间:2023-03-26 21:47:57 301浏览 收藏

本篇文章给大家分享《修改取消引用的结构指针会更改大多数结构值,但不会更改切片》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在尝试创建结构板(棋盘)的浅表副本。在将移动保存到棋盘之前,我需要检查该移动是否会检查移动器。

为此,在 Move 方法(指针方法)中,我 取消引用 指针,更新并检查这个 ** 可能的** 板以进行 Check。当我更改 Board 类型的单个值的值(例如possible.headers = "Possible Varient")时,原始bBoard 不会更改。

但是在这里,当我调用方法 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 指出的,在[Go Slices 的使用和内部](https://blog.golang.org/go-slices-usage-and- internals)结构中,

切片不会复制切片的数据。它创建一个指向原始数组的新切片值。

b.board, a []byte, 总是指向它的原始值(即使保存它的结构被 取消引用 。abhink 的答案使用 Go func copy(dst, src []Type) int,https://golang.org/pkg/builtin/#copy,复制指针值的快捷方式.

正确答案

由于b.board是切片类型,因此它是引用类型([https://blog.golang.org/go-slices-usage-and- internals](https://blog.golang.org/go-slices-usage-and- internals))并且表现得像一个指针。因此对 的任何更改possible.board都会显示在b. 您可以尝试制作这样的副本b.board

func (b *Board) Move(orig, dest int) error {
    // validation
    ...
    // Update 
    possible := *b // A 'shallow copy'?
    boardCopy := make([]byte, len(b.board))
    copy(boardCopy, b.board)
    possible.board = boardCopy

    possible.updateBoard(orig, dest, val, isEmpassant, isCastle)

    // ...

请注意,您必须对所有引用类型执行类似的操作。

到这里,我们也就讲完了《修改取消引用的结构指针会更改大多数结构值,但不会更改切片》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表