首页 > 后端开发 > Golang > 正文

为什么Go语言中使用for range循环遍历切片时,map中所有值指向同一内存地址?

花韻仙語
发布: 2025-03-25 08:42:01
原创
750人浏览过

为什么go语言中使用for range循环遍历切片时,map中所有值指向同一内存地址?

Go语言中for...range循环与map的陷阱

本文分析一个常见的Go语言编程问题,该问题涉及到结构体、切片和map的用法,并解释了为什么使用for...range循环遍历切片时,map中所有值会指向同一内存地址。理解这个问题对于掌握Go语言的内存管理和引用类型至关重要。

问题描述:

以下代码片段演示了该问题:

立即学习go语言免费学习笔记(深入)”;

type student struct {
    name string
    age  int
}

func main() {
    m := make(map[string]*student)
    stus := []student{
        {name: "pprof.cn", age: 18},
        {name: "测试", age: 23},
        {name: "博客", age: 28},
    }

    for _, stu := range stus {
        m[stu.name] = &stu
    }
    for k, v := range m {
        fmt.Println(k, "=>", v.name)
    }
}
登录后复制

运行结果显示所有v.name的值都为"博客"。这是因为for...range循环在遍历切片时,stu变量是一个循环内部的临时变量,其内存地址在每次迭代中都指向同一个内存位置。 因此,m[stu.name] = &stu 实际上将map中的所有值都指向了同一个student结构体的内存地址,而这个地址在循环结束后指向的是最后一个元素"博客"。

解决方案:

为了避免这个问题,应该在循环中使用切片的索引来获取元素的地址,如下所示:

for i := range stus {
    m[stus[i].name] = &stus[i]
}
登录后复制

这种方法确保每个student结构体的地址都是独立的,从而避免了所有值指向同一内存地址的问题。

总结:

此问题揭示了Go语言for...range循环的特性以及引用类型的行为。理解for...range循环中临时变量的生命周期,以及如何正确地处理引用类型,对于编写高效且无错误的Go代码至关重要。 正确使用索引访问切片元素,可以避免此类内存管理陷阱。

以上就是为什么Go语言中使用for range循环遍历切片时,map中所有值指向同一内存地址?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号