Golang:奇怪的大Int行为

时间:2017-05-16 22:34:45

标签: go biginteger 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)
}

当然,这并没有产生正确的答案所以在确定为什么我发现我无意中发现了一种产生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)
} 

我的问题是第一个例子中发生了什么导致每个大的Int变量被设置为i的值,以及为什么这不会产生错误,如果这不是分配大的Int var值的正确方法? i = l等是一个合法的大型Int操作,这种情况根本不正确吗?

1 个答案:

答案 0 :(得分:7)

l = i

pl = l

没有做你认为的事情。

lpli是指针,并将它们彼此分配复制指针值,而不是big.Int值。

执行l = i后,l现在与i指针值相同,指向相同的big.Int。当您使用l.Set(i)时,它会将l的{​​{1}}值设置为big.Int的{​​{1}}值,但i }和big.Int仍然指向两个单独的值。