所以我回來了更多的初學者問題,我似乎無法將我的頭圍繞。 我正在試驗下面的代碼。Golang:幫助理解指針,作業和意外行爲
func main() {
start := time.Now()
var powers []*big.Int
for i := 1; i < 1000; i++ {
I := big.NewInt(int64(i))
I.Mul(I, I)
powers = append(powers, I)
}
fmt.Println(powers)
fmt.Println(time.Since(start))
start = time.Now()
var seqDiffs []*big.Int
diff := new(big.Int)
for i, v := range powers {
if i == len(powers)-2 {
break
}
diff = v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
}
fmt.Println(seqDiffs)
fmt.Println(time.Since(start))
}
我的意圖是要分配子()的結果通過以下方式
diff.Sub(powers[i+1], v)
但是這會導致重複一遍又一遍seqDiffs的值是1995年(正確的最後一個值)來比較差異。我知道,因爲seqDiffs只是一個相同的內存地址指針的列表,但我不明白這很可能就是爲什麼下面的作品就好了
v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, v)
這導致seqDiffs是所有的奇數號碼的列表從3到1995這是正確的,但這不是基本上還是一個指向同一內存地址的指針列表? 此外,爲什麼以下內容正確時它應該也導致seqDiffs是指向同一內存地址的指針列表?
diff = v.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
還我試着做以下方式
diff := new(*big.Int)
for i, v := range powers {
if i == len(powers)-2 {
break
}
diff.Sub(powers[i+1], v)
seqDiffs = append(seqDiffs, diff)
}
但是從IDE收到這些錯誤:
*./sequentialPowers.go:26: calling method Sub with receiver diff (type **big.Int) requires explicit dereference
./sequentialPowers.go:27: cannot use diff (type **big.Int) as type *big.Int in append*
我怎麼會做出 「明確的」 非關聯?
爲了您的最後一個問題,你已經結束了用指針指向一個指針。 new()返回一個指向某個東西的指針,並且在new中你已經把它指向了一個big.Int。所以'diff:= new(* big.Int)'使diff成爲指針的指針。這意味着它不能用於你想要使用它的地方,因爲它只需要一個指向big.Int的指針。 –