2017-02-19 171 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) 

(和使用指針中一般作爲值不是特別有用)