Golang for-range 中的指针内存问题_Mr.禾的博客-CSDN博客_go range 指针

记录一下使用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) //range每次的v都是用同一块内存地址来存储,所以newArr中存一样的值
    }
    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]) //range每次的v都是用同一块内存地址来存储,所以newArr中存一样的值
    }
    for _, v := range newArr {
        println(*v)
    }
}

测试结果:
在这里插入图片描述


原网址: 访问
创建于: 2022-08-23 15:46:37
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论