复制后,原始对象仍在修改中

时间:2014-10-12 01:30:26

标签: pointers go

在以下代码中,为什么n的值被修改? (playground link

package main

import (
    "fmt"
    "math/big"
)

func main() {
    n := big.NewInt(5)
    nCopy := new(big.Int)
    *nCopy = *n

    // The values of "n" and "nCopy" are expected to be the same.
    fmt.Println(n.String(), nCopy.String(), &n, &nCopy)

    nCopy.Mod(nCopy, big.NewInt(2))

    // The values of "n" and "nCopy", I would think, should be different.
    fmt.Println(n.String(), nCopy.String(), &n, &nCopy)
}

阅读this answer似乎表示我的示例main()中的第三行应该复制n的内容。在两个Println语句中输出的两个变量的地址似乎也表明两个big.Int存储在不同的内存位置。

我意识到我可以使用*nCopy = *n而不是nCopy.Set(n)使用Println,而我的最终*nCopy = *n会显示我期望的内容。但我很好奇为什么{{1}}似乎保留了一个"链接"两个指针之间。

1 个答案:

答案 0 :(得分:2)

Int是具有nat field的结构。 nat是slice

复制Int时,原始副本和副本共享nat的后备数组。通过一个Int到后备数组的修改对另一个Int。

是可见的

作业不是深层复制品。分配结构值等同于单独分配结构中的字段。切片的分配不会复制后备阵列。