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 关注
- 388 浏览
添加回答
举报