go - 为什么切片中元素的地址相同?以及如何将它们复制到指针?
问题描述
我有一段代码:
//initialize a slice
arr := make([]int, 0)
arr = append(arr, 1, 2)
for _, k := range arr {
fmt.Printf("%p %+v\n", &k, k)
}
//make a copy, but the element is a pointer
arrP := make([]*int, 0)
for _, k := range arr {
arrP = append(arrP, &k)
}
//why arrP is different with arr?
for _, k := range arrP {
fmt.Printf("%p %+v\n", k, *k)
}
结果是:
0xc000018088 1
0xc000018088 2
0xc000090000 2
0xc000090000 2
我的问题:
为什么地址是一样的?
为什么 arrP[0] 的值不是 1?
解决方案
请参阅Go CommonMistakes:使用对循环迭代器变量的引用
为什么地址是一样的?
k 的值随着循环的前进而更新。
为什么 arrP[0] 的值不是 1?
与上述相同。
使用您提供的示例的修改版本进行演示:
arr := make([]int, 0)
arr = append(arr, 1, 2)
for i, _ := range arr {
fmt.Printf("%p %+v\n", &arr[i], arr[i])
}
arrP := make([]*int, 0)
for i, _ := range arr {
arrP = append(arrP, &arr[i])
}
for i, _ := range arrP {
fmt.Printf("%p %+v\n", arrP[i], *arrP[i])
}
结果是:
0xc00009a010 1
0xc00009a018 2
0xc00009a010 1
0xc00009a018 2
推荐阅读
- javascript - 如何使用 JavaScript 对象作为过滤条件?
- .net-core - .Net Core 与 WS-Federation 生成大型 wctx
- c++ - 试验线程优先级 C++
- r - R:有人能在我的对数转换(多元线性回归)中发现错误吗?
- c - 查找 int 数组 C 中的所有回文
- arrays - NumPy 数组的最小值和最大值都是 NaN
- javascript - 如何使用 fetch 将数据发布到 php
- php - Symfony 信使队列与绑定键 - 重试策略
- c - 无法使用结构来存储和稍后使用 recvfrom 打印 udp 数据
- android - 我可以在 Android 上使用 Guice 吗?