big.NewInt匿名变量的奇怪行为

时间:2017-02-25 05:57:18

标签: go

在下面的代码段中,我想进行一个非常简单的计算d = a + b + c; a, b, c = b, c, d。它迭代了好几次。

在第一次尝试中,我创建了一个匿名变量big.NewInt(0).Add(a, b)来获取a + b的结果,然后添加它并c以获得a + b + c的最终结果。但是从第二次迭代开始,d.Add(big.NewInt(0).Add(a, b), c)更改了c,然后b,然后a的值,当然,最终结果是错误的。

然而,第二次尝试的方法给了我正确的答案。谁能告诉我为什么,拜托?

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // first try
    a := big.NewInt(1)
    b := big.NewInt(2)
    c := big.NewInt(3)
    d := big.NewInt(0)
    for i := 0; i < 5; i++ {
        // d = a + b + c
        d.Add(big.NewInt(0).Add(a, b), c)
        fmt.Println(a, b, c, d)
        // a <- b, b <- c, c <- d
        a, b, c = b, c, d
        fmt.Println(a, b, c, d)
    }
    fmt.Println(d)

    // second try
    a = big.NewInt(1)
    b = big.NewInt(2)
    c = big.NewInt(3)
    d = big.NewInt(0)
    for i := 0; i < 5; i++ {
        // d = a + b + c
        d = big.NewInt(0).Add(big.NewInt(0).Add(a, b), c)
        fmt.Println(a, b, c, d)
        // a <- b, b <- c, c <- d
        a, b, c = b, c, d
        fmt.Println(a, b, c, d)
    }

    fmt.Println(d)
}

1 个答案:

答案 0 :(得分:0)

math/big.NewInt会将指针返回给Int,因此在您第一次迭代后,cd都会指向相同的对象。这意味着,在第二次迭代中,当您向d添加内容时,相同的更改将反映在c中。然后将c复制到b,以便b也指向同一个对象,并在下一次迭代ba,所以在第三次迭代后,所有4个变量都指向相同的Int

您的第二个循环有效,因为您每次为Int创建一个新的d,因此每次移动指针时,都会出现 new Int(为d创建的一个会被移至c,然后移至b,然后移至a