【发布时间】:2017-05-20 15:13:15
【问题描述】:
所以我回来了更多我似乎无法解决的初学者问题。 我正在试验以下代码。
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))
}
我的意图是通过以下方式将 Sub() 的结果分配给 diff
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 的指针。
标签: pointers go variable-assignment biginteger