热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【golang】关于forrange中只存储最后一个元素的问题

【golang】关于forrange中只存储最后一个元素的问题-前言:今天用forrange写了个demo,发现无论怎么运行,最后的结果是一直是最后一个。自己思考过后,又和

前言:

  今天用for range写了个demo,发现无论怎么运行,最后的结果是一直是最后一个。自己思考过后,又和其他伙伴商量了下,最终算是解决了自己的疑惑。

正文:

  下面我们来看个例子:

m := make(map[int]*int)
    arr := []int{1, 2, 3, 4, 5}
    for i, v := range arr {
        m[i] = &v
    }
    for k, v := range m {
        fmt.Println("k-->v", k, *v)
    }

大家思考下最后的结果.......

放出答案,因为map是无序的,我们只考虑value即可。发现value的值是5,和理想中的不一样。

 如果你对这个问题也感觉到疑惑,那就跟着我来一探究竟吧~

for range的特性:

  for range 每次都是拷贝原变量的副本,也就是值拷贝。

在上述题目过程中,我们拷贝的并不是arr[i]对应的地址,而是变量v的地址。你可能说变量v不就是arr[i]嘛,答案是并不是,v只不过是一个临时变量罢了。上面的代码其实等价于:

m := make(map[int]*int)
    arr := []int{1, 2, 3, 4, 5}
    for i, v := range arr {//    v 临时变量,负责值拷贝
        v = arr[i] //    最后存入的是v的地址,v每次循环过程中值都在改变,所以最后结果是5
        m[i] = &v
    }
    for k, v := range m {
        fmt.Println("k-->v", k, *v)
    }

博主对于for range遍历每次都是最后一个值的理解大概就是这样,如果有错误,欢迎指出~

不骄不躁,保持学习


推荐阅读
  • [Redis 系列]redis 学习六,redis 事务处理和监控事务
    【Redis系列】redis学习六,redis事务处理和监控事务写在前面我们学过的事务都是保证原子性的,但是redis的事务中执行多个指令,是不保证原子性的redis事务的本质就是 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。类型T表示任意的一种类型双向:chan ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • 目标由于众所周知的原因,golang.org无法直接访问,golang文档和安装包无法下载,golang.orgxnet等官方包无法下载。常见解决方案是无脑挂代理,解决一切问题,但 ... [详细]
  • 怎么编译并运行golang程序
    怎么编译并运行golang程序?刚入门的朋友还不知道怎么编译运行golang程序,通过这篇文章的总结,希望你能学会书写你的第一个go语言程序。首先我们 ... [详细]
  • Go 快速入门指南正则表达式
    概述调用regexp包即可。例子是否匹配packagemainimport(fmtregexp)funcmain(){match,err:regexp.MatchStrin ... [详细]
  • Go Mutex 源码学习
    概述互斥锁是并发程序中对共享资源进行访问控制的主要手段,Mutex是go语言提供的简单易用的互斥锁。Mutex的结构很简单,暴露的方法也只有2个,一个加锁一个解锁。那么我们每天用的 ... [详细]
author-avatar
蓝蓝__的夜夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有