1 回答

TA貢獻1828條經驗 獲得超3個贊
正如類型名稱所暗示的那樣, a*big.Int是一個指針,并且根據文檔big.Int.Add:
將集合 z 添加到總和 x+y 并返回 z。
“回報z”很重要,因為這意味著當你這樣做時:
temp := []*big.Int{
d.Add(e.Mul(a, a), f.Mul(b, b)),
d.Add(e.Mul(a, b), f.Mul(b, c)),
d.Add(e.Mul(b, b), f.Mul(c, c))
}
切片的所有三個元素最終都是指向相同的指針big.Int,即指向d. Add您的三個調用中的每一個都可能會更改d,但它們都在更改(并返回指向)相同的單個對象,這不是您想要的。
為了避免這種行為,您需要為每個不同的結果創建一個新的、不同的對象,例如:
temp := []*big.Int{
big.NewInt(0).Add(big.NewInt(0).Mul(a, a), big.NewInt(0).Mul(b, b)),
big.NewInt(0).Add(big.NewInt(0).Mul(a, b), big.NewInt(0).Mul(b, c)),
big.NewInt(0).Add(big.NewInt(0).Mul(b, b), big.NewInt(0).Mul(c, c)),
}
如果你想最小化分配,你應該能夠做到:
x, y := big.NewInt(0), big.NewInt(0)
temp := []*big.Int{
big.NewInt(0).Add(x.Mul(a, a), y.Mul(b, b)),
big.NewInt(0).Add(x.Mul(a, b), y.Mul(b, c)),
big.NewInt(0).Add(x.Mul(b, b), y.Mul(c, c)),
}
因為Adds它們是按順序完成的并且指向和的指針x沒有y保留,所以你重用它們的副本這一事實不會引起問題。但是對于切片的三個元素,您需要不同的對象。
- 1 回答
- 0 關注
- 472 瀏覽
添加回答
舉報