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

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

    前言

    在Golang中使用 for range 语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。

    下面的代码中定义了一个元素类型为 *int 的通道 ch :

    package main
    
    import (
     "fmt"
    )
    
    func main() {
     ch := make(chan *int, 5)
     
     //sender
     input := []int{1,2,3,4,5}
     
     go func(){
      for _, v := range input {
       ch - v
      }
      close(ch)
     }()
     //receiver
     for v := range ch {
      fmt.Println(*v)
     }
    }

    在上面代码中,发送方将 input 数组发送给 ch 通道,接收方再从 ch 通道中接收数据,程序的预期输出应该是:

    现在运行一下程序,得到的输出如下:

    很明显,程序并没有达到预期的结果,那么问题出在哪里呢?我们将代码稍作修改:

    //receiver
      for v := range ch {
        fmt.Println(v)
      }

    得到如下输出:

    0x416020
    0x416020
    0x416020
    0x416020
    0x416020

    可以看到,5次输出变量 v ( *int )都指向了同一个地址,返回去检查一下发送部分代码:

    for _, v := range input {
      ch - v
    }

    问题正是出在这里,在 for range 语句中, v 变量用于保存迭代 input 数组所得的值,但是 v 只被声明了一次,此后都是将迭代 input 出的值赋值给 v , v 变量的内存地址始终未变,这样再将 v 的地址发送给 ch 通道,发送的都是同一个地址,当然无法达到预期效果。

    解决方案:

    引入一个中间变量,每次迭代都重新声明一个变量 temp ,赋值后再将其地址发送给 ch :

    for _, v := range input {
      temp := v
      ch - temp
    }

    抑或直接引用数据的内存(推荐,无需开辟新的内存空间):

    for k, _ := range input {
      c - input[k]
    }

    再次运行,就可看到预期的效果。以上方案是用于讨论 range 语句带来的问题,当然,平时还是尽量避免使用指针类型的通道。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • Go语言应该什么情况使用指针
    • Go 语言的指针的学习笔记
    • Go语言中结构体方法副本传参与指针传参的区别介绍
    • golang中值类型/指针类型的变量区别总结
    • golang方法中receiver为指针与不为指针的区别详析
    • Go语言中的指针运算实例分析
    • Go语言指针访问结构体的方法
    • Go语言指针使用分析与讲解
    上一篇:golang顺时针打印矩阵的方法示例
    下一篇:Go语言字符串高效拼接的实现
  • 相关文章
  • 

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

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

    关于Golang中range指针数据的坑详解 关于,Golang,中,range,指针,