• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解Go语言中for range的坑

    前言

    Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下:

    func main() {
      arr1 := []int{1, 2, 3}
      arr2 := make([]*int, len(arr1))
    
      for i, v := range arr1 {
        arr2[i] = v
      }
    
      for _, v := range arr2 {
        fmt.Println(*v)
      }
    }
    
    

    代码解析:

    从代码上看,打印出来的结果应该是

    1
    2
    3

    然而真正的结果是

    3
    3
    3

    原因

    因为for range在遍历值类型时,其中的v变量是一个值的拷贝,当使用获取指针时,实际上是获取到v这个临时变量的指针,而v变量在for range中只会创建一次,之后循环中会被一直重复使用,所以在arr2赋值的时候其实都是v变量的指针,而v最终会指向arr1最后一个元素的值拷贝。

    来看看下面这个代码,用for i来模拟for range,这样更易于理解:

    func main() {
      arr1 := []int{1, 2, 3}
      arr2 := make([]*int, len(arr1))
    
      var v int
      for i:=0;ilen(arr1);i++ {
        v = arr1[i]
        arr2[i] = v
      }
    
      for _, v := range arr2 {
        fmt.Println(*v)
      }
    }
    
    

    解决方案

    传递原始指针

    func main() {
      arr1 := []int{1, 2, 3}
      arr2 := make([]*int, len(arr1))
    
      for i := range arr1 {
        arr2[i] = arr1[i]
      }
    
      for _, v := range arr2 {
        fmt.Println(*v)
      }
    }
    
    

    使用临时变量

    func main() {
      arr1 := []int{1, 2, 3}
      arr2 := make([]*int, len(arr1))
    
      for i, v := range arr1 {
        t := v
        arr2[i] = t
      }
    
      for _, v := range arr2 {
        fmt.Println(*v)
      }
    }
    
    

    使用闭包

    func main() {
      arr1 := []int{1, 2, 3}
      arr2 := make([]*int, len(arr1))
    
      for i, v := range arr1 {
        func(v int){
           arr2[i] = v
        }(v)
      }
    
      for _, v := range arr2 {
        fmt.Println(*v)
      }
    }
    
    

    官方提示

    由于这一问题过于普遍,Golang甚至将其写入了文档的『常见错误』部分:文档

    到此这篇关于详解Go语言中for range的"坑"的文章就介绍到这了,更多相关Go语言for range内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • golang中for range的取地址操作陷阱介绍
    • Go语言for range(按照键值循环)遍历操作
    • go for range遍历二维数组的示例
    • go for range坑和闭包坑的分析
    • go实现for range迭代时修改值的操作
    上一篇:golang映射Map的方法步骤
    下一篇:GoAdminGroup/go-admin的安装和运行的教程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解Go语言中for range的坑 详解,语,言中,for,range,的坑,