当我将一个big.Int的实例指向另一个big.Int时,我遇到了go's big.Int的一些无法解释的行为。我知道,为了将bit.Int实例的值设置为另一个实例,必须使用Int.SetXXX设置器,因为它们实际上会导致将big.Int中的底层abs片复制到新分配的数组中。
请考虑以下几点:
错误的示例(基础值发生变异):
func main() {
v1p := big.NewInt(1)
v2p := big.NewInt(2)
v1 := *v1p
v2 := *v2p
v2 = v1
v1.SetInt64(3)
fmt.Println(v1.Int64(), v2.Int64())
}(在这里运行:https://play.golang.org/p/WxAbmGdKG9b)
正确的示例(值不发生变异):
func main() {
v1p := big.NewInt(1)
v2p := big.NewInt(2)
v1 := *v1p
v2 := *v2p
v2.Set(v1p)
v1.SetInt64(3)
fmt.Println(v1.Int64(), v2.Int64())
}(在这里运行:https://play.golang.org/p/16qsGhwHIWf)
如果我的理解是正确的,下面的内容将从根本上说明在错误的示例中发生了什么:
func main() {
var a, b *int // analogous to the 2 big.Int pointers returned
c, d := 3, 3
a = &c // we set the pointers to point to something we can then dereference
b = &d
e := *a // e and f should now point to the values pointed to by the pointers
f := *b
// the rest is self-explanatory
e = f
c = 5
d = 4
fmt.Println(a, b, c, d, e, f)
}(在这里运行:https://play.golang.org/p/cx76bnmJhG7)
我唯一的假设是,在错误的示例中,当将结构内容复制到v2时,所发生的情况是,abs片不会被深度复制,而是它引用的存储实际上与v1中的片所指向的存储相同。
真的是这样吗?根据语言规范,这也是预期的行为吗?
发布于 2020-03-24 08:17:24
正如icza和Volker所指出的那样,因为当取消引用big.Int指针时,实际的值片头结构被复制,指向相同的基础值,结果是从多个切片引用相同的基础数组,从而导致一个改变另一个。
https://stackoverflow.com/questions/60816742
复制相似问题