big.Int slice 在 append() 上重写自身
big.Int slice rewriting itself on append()
我正在尝试获取 3 和 i
的平方根之间的奇数 big.Ints
的一部分。
当我运行以下代码时:
import (
"fmt"
"math/big"
)
func main() {
i := big.NewInt(101)
var divisorsOfPrime []*big.Int
squareRoot := big.NewInt(0).Sqrt(i)
for n := big.NewInt(3); n.Cmp(squareRoot) == -1; n.Add(n, big.NewInt(2)) {
divisorsOfPrime = append(divisorsOfPrime, n)
}
fmt.Println(divisorsOfPrime)
}
我得到输出:
[11 11 11 11]
但我希望输出:
[3 5 7 9 11]
我该怎么做才能解决这个问题?
谢谢
你有一片 *big.Int
,你在其中一遍又一遍地存储相同的指针。
相反,您需要在每次迭代时存储 n
的副本。
替换:
divisorsOfPrime = append(divisorsOfPrime, n)
有:
nCopy := new(big.Int).Set(n)
divisorsOfPrime = append(divisorsOfPrime, nCopy)
顺便说一下,这不是 *big.Int
特有的;只要您正在处理指针,就需要创建新对象并将指针存储到这些新对象,而不是原始对象。请注意 n
只分配了一次。
我正在尝试获取 3 和 i
的平方根之间的奇数 big.Ints
的一部分。
当我运行以下代码时:
import (
"fmt"
"math/big"
)
func main() {
i := big.NewInt(101)
var divisorsOfPrime []*big.Int
squareRoot := big.NewInt(0).Sqrt(i)
for n := big.NewInt(3); n.Cmp(squareRoot) == -1; n.Add(n, big.NewInt(2)) {
divisorsOfPrime = append(divisorsOfPrime, n)
}
fmt.Println(divisorsOfPrime)
}
我得到输出:
[11 11 11 11]
但我希望输出:
[3 5 7 9 11]
我该怎么做才能解决这个问题?
谢谢
你有一片 *big.Int
,你在其中一遍又一遍地存储相同的指针。
相反,您需要在每次迭代时存储 n
的副本。
替换:
divisorsOfPrime = append(divisorsOfPrime, n)
有:
nCopy := new(big.Int).Set(n)
divisorsOfPrime = append(divisorsOfPrime, nCopy)
顺便说一下,这不是 *big.Int
特有的;只要您正在处理指针,就需要创建新对象并将指针存储到这些新对象,而不是原始对象。请注意 n
只分配了一次。