标签: go biginteger
我试图通过欧几里德方法计算两个数字的GCD,并注意到奇怪的行为。虽然我将数字的值传递给函数,但是数字由具有低位数(通常小于64)的数字的函数修改。任何人都可以澄清这是代表我的错误还是预期的行为?您可以在这里查看游乐场中的代码:Golang playground example
我认为预期的行为是不应该通过将它们传递给我的函数来改变它们。感谢您的帮助,在搜索的最后一天,我无法找到其他类似的事件。
答案 0 :(得分:3)
big.Int是一个包含nat的结构,定义为type nat []Word 所以,当你确实在复制big.Int时,它内部的切片实际上是一个浅层副本(切片的底层存储是相同的)
type nat []Word
为什么较大的位宽不会出现问题,不确定。
可能需要在某处重新分配并创建一个新的[]Word,从而保留原文。
[]Word
这也可能是stdlib通常返回* big.Int的原因,因为值不是真正可复制的
这是一个版本on play,可以正确复制big.Int值。 关键的区别是:
a := new(big.Int).Set(x) b := new(big.Int).Set(y)
(并且通常使用指针作为值不是特别有用)