复制后原来的对象还在被修改

在下面的代码中为什么n要修改的值?(游乐场链接)


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)

}

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


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


倚天杖
浏览 194回答 1
1回答

翻翻过去那场雪

Int 是一个带有nat 字段的结构体。一个 nat 是一个slice。当您复制 Int 时,原始和副本共享 nat 的支持数组。通过一个 Int 对后备数组的修改对另一个 Int 可见。赋值不是深拷贝。结构体值的赋值相当于单独分配结构体中的字段。切片的赋值不会复制后备数组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go