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

Go big.NewInt匿名变量的奇怪行为,go,Go,在下面的代码片段中,我想做一个非常简单的计算d=a+b+c;a、 b,c=b,c,d。它迭代了好几次 在第一次尝试中,我创建了一个匿名变量big.NewInt(0)。添加(a,b)以获得a+b的结果,然后添加它和c以获得a+b+c的最终结果。但是从第二次迭代开始,d.Add(big.NewInt(0).Add(a,b),c)改变了c的值,然后是b,然后是a,当然,最终结果是错误的 然而,第二次尝试的方法给了我正确的答案。有人能告诉我为什么吗 package main import (

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

在第一次尝试中,我创建了一个匿名变量
big.NewInt(0)。添加(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)
}
主程序包
进口(
“fmt”
“数学/大”
)
func main(){
//初试
a:=大的。新的(1)
b:=big.NewInt(2)
c:=big.NewInt(3)
d:=big.NewInt(0)
对于i:=0;i<5;i++{
//d=a+b+c
d、 加法(大的,新的(0),加法(a,b,c)
格式打印LN(a、b、c、d)
//a返回一个指向
Int
的指针,因此在第一次迭代后,
c
d
都指向相同的对象。这意味着,在第二次迭代中,当您向
d
添加内容时,相同的更改将反映在
c
中。然后您将
c
复制到
b
so
b
也将指向同一个对象,在下一次迭代中,
b
指向
a
,因此在第三次迭代后,所有4个变量都指向相同的
Int


第二个循环之所以有效,是因为每次为
d
创建一个新的
Int
,所以每次移动指针时,一个新的
Int
(为
d
创建的那一个)都会移动到
c
,然后移动到
b
,然后移动到
a
,谢谢。