在下面的代码段中,我想进行一个非常简单的计算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)
}
答案 0 :(得分:0)
math/big.NewInt会将指针返回给Int
,因此在您第一次迭代后,c
和d
都会指向相同的对象。这意味着,在第二次迭代中,当您向d
添加内容时,相同的更改将反映在c
中。然后将c
复制到b
,以便b
也指向同一个对象,并在下一次迭代b
到a
,所以在第三次迭代后,所有4个变量都指向相同的Int
。
您的第二个循环有效,因为您每次为Int
创建一个新的d
,因此每次移动指针时,都会出现 new Int
(为d
创建的一个会被移至c
,然后移至b
,然后移至a
。