type student struct {name stringage  int
}func main() {m := make(map[string]*student)stus := []student{{name: "小王子", age: 18},{name: "娜扎", age: 23},{name: "大王八", age: 9000},}for _, stu := range stus {m[stu.name] = &stu}for k, v := range m {fmt.Println(k, "=>", v.name)}
}

返回异常值:

娜扎 => 大王八
大王八 => 大王八
小王子 => 大王八

正确应该返回:

娜扎 => 娜扎
大王八 => 大王八
小王子 => 小王子

修改后:

type student struct {name stringage  int
}func main() {m := make(map[string]*student)stus := []student{{name: "小王子", age: 18},{name: "娜扎", age: 23},{name: "大王八", age: 9000},}for _, stu := range stus {s := stum[stu.name] = &s}for k, v := range m {fmt.Println(k, "=>", v.name)}
}

原因分析:
来看一下for循环输出的结果:

for _, stu := range stus {m[stu.name] = &stufmt.Println(m)
}for k, v := range m {fmt.Println(k)fmt.Println(v)fmt.Println(k, "=>", v.name)
}
返回值:map[小王子:0xc000004078]
map[娜扎:0xc000004078 小王子:0xc000004078]
map[大王八:0xc000004078 娜扎:0xc000004078 小王子:0xc000004078]小王子
&{大王八 9000}
小王子 => 大王八娜扎
&{大王八 9000}
娜扎 => 大王八大王八
&{大王八 9000}
大王八 => 大王八
结果:
可以看到m输出的值中有固定的地址0xc000004078(每个人运行出来的地址会有不同),所以代表m的v值是相同的,
所以0xc000004078这个地址表示的是"大王八 9000"这个值
原因:
for 循环每次产生的 key 和 value 其实是对应的 stus 里面值的拷贝,不是对应的 stus 里面的值的引用,
所以出现了这种问题
原因:
stu 是 stus 在for循环中申请的一个局部变量,每次循环都会拷贝 stus 中对应的值 stu。迭代遍历之后,
stu 每次会被重新赋值,而在 m 这个 map 中记录的 value 只不过是 最后一次拷贝的stu 的内存地址

go map 取值异常相关推荐

  1. java map 允许null值,Map取值方法,其中取得多种值,避免null值转换

    ~~~ import java.math.BigDecimal; import java.util.Date; import java.util.Map; /** * * Map取值方法,其中取得多种 ...

  2. [java]Map取值方法,其中取得多种值,避免null值转换

    import java.math.BigDecimal; import java.util.Date; import java.util.Map;/*** <p>* Map取值方法,其中取 ...

  3. 循环map取值的方法

    [size=large][b] 循环map取值的方法,如下所示:[/b][/size] [b]方法一:[/b] [code="java"]Map<String, String ...

  4. java enumerator_java 中遍历取值异常(Hashtable Enumerator)解决办法

    java 中遍历取值异常(Hashtable Enumerator)解决办法 用迭代器取值时抛出的异常:java.util.NoSuchElementException: Hashtable Enum ...

  5. c++ map取值的find、[]、at方法特性对比

    背景 项目中经常需要对std::map进行插入和取值操作,以前经常使用find和[]直接操作,c++11引入了at方法. 本文主要介绍它们的使用方法和不同之处. find 很直观的查找元素操作,如: ...

  6. java map取值_Java Set接口 Map 与枚举

    Set接口 概述 一个不包含重复元素的 collection.更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素 特点 Set接口是 ...

  7. java从map取值_java的map取值

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; /** * @param args */ public static vo ...

  8. C++ Map取值的坑

    在C#中习惯用key作为下标来访问map中的value,如string valueStr = dataMap[key]; 但是在C++测试的时候发现一个不存在的key值取出了一个非null的值.原来用 ...

  9. 空map取值(中文网)——20221028

    中文网 下面这段代码输出什么? type person struct { name string }func main() { var m map[person]intp := person{&quo ...

最新文章

  1. 关于如何使用机器学习来做异常检测的7个问题
  2. 绘制分类界面以及性能曲面中的meshgrid函数
  3. [Android] for ArcFace Demo
  4. 关于Modernizr的使用
  5. 如何分析SAP UI5应用的undefined is not a function错误
  6. WP7 空闲检测 当手机处理锁屏状态时 如何让程序继续运行 如 在锁屏状态下继续录音。...
  7. ldap统一用户认证php,针对LDAP服务器进行身份认证
  8. Sqlite大数据量查询优化比较-转
  9. 腾讯云启动 tomcat 很慢的问题
  10. svn checkout的时候报E000022错误
  11. 贺州计算机学院,贺州学院
  12. Swoole 结合TP5创建http服务
  13. OpenGL第三方库:glad初始了解与下载
  14. 海康大华宇视硬件NVR通过GB28181注册接入到LiveGBS国标流媒体服务后通道显示为0如何处理
  15. Linux 音频编程 -- 如何使用ALSE库播放wav文件
  16. 基本的 DBus 偵錯技巧
  17. lpx寒假作业案例7
  18. Oracle:表或视图不存在
  19. 1块钱30分钟利用华为云服务器配置一台云电脑并搭建一个简易网站(步步截图较详细)
  20. 算法 树7 二叉搜索树的操作集

热门文章

  1. net, 哥已心灰意冷
  2. win7硬件要求_可以玩使命召唤14,只要win7系统,怎么配电脑?-鑫谷光荣使命GT...
  3. 为何抢跑了成长型企业SaaS赛道?先看看用友YonSuite有多了解企业
  4. 淘票票总裁:中国电影能带动至少2000亿元供应链市场
  5. TiDB亿级数据亚秒响应查询扩缩容
  6. 一个五年 Android 开发者百度、阿里、聚美、映客的面试心经
  7. QT5:获取本机摄像头/usb摄像头 实现拍照保存功能
  8. Win10预发行版5个密钥曝光!激活就靠它
  9. 视频均衡器、HDMI/DVI信号放大器应用
  10. 条码生成软件如何制作递减流水号的RM4SCC码