2017-02-19 175 views
-1

我想通过欧几里德方法计算两个数字的GCD,并注意到奇怪的行为。尽管我将该数字的值传递给函数,但数字通过函数修改了位数较少(通常小于64)的数字。任何人都可以澄清,如果这是我的错误或预期的行为?你可以在这里查看操场上的代码:Golang playground exampleGolang奇怪big.Int行为的小数位

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

回答

2

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) 

(和使用指针中一般作为值不是特别有用)