gpt4 book ai didi

pointers - 复制原始对象后仍在修改

转载 作者:IT王子 更新时间:2023-10-29 02:05:48 24 4
gpt4 key购买 nike

在下面的代码中,为什么修改了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.Set(n) 而不是使用 *nCopy = *n 并且我的最终 Println 会显示我期望它做什么。但我很好奇为什么 *nCopy = *n 似乎在两个指针之间保留了一个“链接”。

最佳答案

Int 是一个带有 nat field 的结构. nat 是一个 slice .

当你复制 Int 时,原件和副本共享 nat 的后备数组。通过一个 Int 对支持数组的修改对另一个 Int 可见。

赋值不是深拷贝。结构值的分配等同于单独分配结构中的字段。 slice 的分配不会复制支持数组。

关于pointers - 复制原始对象后仍在修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26320964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com