Golang怪异的big.Int行为少量的位

时间:2017-02-19 15:14:40

标签: go biginteger

我试图通过欧几里德方法计算两个数字的GCD,并注意到奇怪的行为。虽然我将数字的值传递给函数,但是数字由具有低位数(通常小于64)的数字的函数修改。任何人都可以澄清这是代表我的错误还是预期的行为?您可以在这里查看游乐场中的代码:Golang playground example

我认为预期的行为是不应该通过将它们传递给我的函数来改变它们。感谢您的帮助,在搜索的最后一天,我无法找到其他类似的事件。

1 个答案:

答案 0 :(得分:3)

big.Int是一个包含nat的结构,定义为type nat []Word 所以,当你确实在复制big.Int时,它内部的切片实际上是一个浅层副本(切片的底层存储是相同的)

为什么较大的位宽不会出现问题,不确定。

可能需要在某处重新分配并创建一个新的[]Word,从而保留原文。

这也可能是stdlib通常返回* big.Int的原因,因为值不是真正可复制的

这是一个版本on play,可以正确复制big.Int值。 关键的区别是:

a := new(big.Int).Set(x)
b := new(big.Int).Set(y)

(并且通常使用指针作为值不是特别有用)