记录一下使用range遍历遇到的bug,想用另一个数组或切片去存储range中的value地址时会储存一样的值,见代码
package main
import "fmt"
func main() {
arr := []int{1, 2, 3}
newArr := []*int{}
for idx, v := range arr {
fmt.Printf("[idx]=%d,[&v]=%p\n", idx, &v)
newArr = append(newArr, &v)
}
for _, v := range newArr {
println(*v)
}
}
测试结果如下,可以看出range中的value值每次都是用同一地址来存储数值,newArr 中自然都存的一样的地址 解决办法是使用&arr[idx]
package main
import "fmt"
func main() {
arr := []int{1, 2, 3}
newArr := []*int{}
for idx:= range arr {
fmt.Printf("[idx]=%d,arr[%d]=%p\n", idx, idx, &arr[idx])
newArr = append(newArr, &arr[idx])
}
for _, v := range newArr {
println(*v)
}
}
测试结果:
|