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
sob
也将指向同一个对象,在下一次迭代中,b
指向a
,因此在第三次迭代后,所有4个变量都指向相同的Int
第二个循环之所以有效,是因为每次为d
创建一个新的Int
,所以每次移动指针时,一个新的Int
(为d
创建的那一个)都会移动到c
,然后移动到b
,然后移动到a
,谢谢。