2014-10-12 66 views
1

在下面的代码中,为什么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似乎保留了这两个指针之间的“联系”。

回答

2

Int是一个结构体nat field。一个nat是一个slice

当您复制Int时,原始副本和副本共享nat的后备阵列。另一个Int可以看到通过一个Int修改到支持数组。

作业不是深层副本。赋值一个结构体的值相当于分别在结构体中赋值字段。分配片不会复制后备阵列。

+0

因此'* nCopy = * n'不是“深层复制”。底层结构可能会或可能不会被复制? – jason 2014-10-12 02:10:53

相关问题