Ste*_*ams -1 biginteger go bigint
所以我是Go的新手,对编程总体上缺乏经验,所以我希望我不会因为提出愚蠢的问题而再次投票.我正在通过项目euler问题和问题25"1000位Fibonacci数字"工作我遇到了似乎奇怪的行为.以下是我编写的导致此行为的代码.
package main
import (
"fmt"
"math/big"
)
func main() {
index := 2
l := new(big.Int)
pl := big.NewInt(1)
i := big.NewInt(1)
for {
l = i
i.Add(i, pl)
pl = l
index++
if len(i.String()) == 1000 {
break
}
}
fmt.Println(i, "\nindex: ", index)
}
Run Code Online (Sandbox Code Playgroud)
当然,这并没有产生正确的答案所以在确定为什么我发现我无意中发现了一种产生2的幂的简洁方法的过程中.我做了以下更改,这确实产生了正确的结果.
package main
import (
"fmt"
"math/big"
)
func main() {
index := 2
l := new(big.Int)
pl := big.NewInt(1)
i := big.NewInt(1)
for {
l.Set(i)
i.Add(i, pl)
pl.Set(l)
index++
if len(i.String()) == 1000 {
break
}
}
fmt.Println(i, "\nindex: ", index)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是第一个例子中发生了什么导致每个大的Int变量被设置为i的值以及为什么如果这不是分配大的Int var值的正确方法,这不会产生错误?i = l等是一个合法的大型Int操作,这种情况根本不正确吗?
线条
l = i
Run Code Online (Sandbox Code Playgroud)
和
pl = l
Run Code Online (Sandbox Code Playgroud)
没有做你认为他们的事.
l,, pl和i是指针,并将它们彼此分配复制指针值,而不是big.Int值.
执行后l = i,l现在是指针值相同i,指向相同big.Int.当您使用l.Set(i)时,它设置l的big.Int值i的big.Int价值,但l并i仍然指向两个不同的值.