为什么Go语言中使用for range遍历slice并存入map时,所有值会变成最后一个元素?
Go语言Map迭代陷阱:为何所有值都指向最后一个元素?
Go语言中的for...range
循环与map
数据结构结合使用时,容易出现一个常见的陷阱:当遍历切片并将元素添加到map
中时,所有map
的值最终都指向最后一个元素。本文将通过代码示例分析其原因,并提供解决方案。
让我们来看一段代码:
type Student struct { Name string Age int } func main() { m := make(map[string]*Student) students := []Student{ {Name: "pprof.cn", Age: 18}, {Name: "测试", Age: 23}, {Name: "博客", Age: 28}, } for _, stu := range students { m[stu.Name] = &stu // 问题出在这里 } for k, v := range m { fmt.Println(k, "=>", v.Name) } }
这段代码的预期结果是将students
切片中的每个Student
结构体存储到map
中。然而,运行结果却显示所有map
的值都指向最后一个元素“博客”:
<code>pprof.cn => 博客 测试 => 博客 博客 => 博客</code>
问题根源:for...range
循环的变量作用域
问题在于for...range
循环中,stu
变量并非每次迭代都创建一个新的变量。它指向的是students
切片中同一个内存地址。每次迭代,stu
的值都会被更新,但其内存地址保持不变。因此,当循环结束后,map
中的所有指针都指向stu
的最终值(最后一个元素)。
解决方案:创建新的变量副本
为了解决这个问题,我们需要在每次迭代中创建一个stu
变量的副本,确保map
中存储的是不同的内存地址。修改后的代码如下:
for _, stu := range students { newStu := stu // 创建副本 m[newStu.Name] = &newStu }
或者,更简洁的方法是直接创建新的Student
结构体:
for _, stu := range students { m[stu.Name] = &Student{Name: stu.Name, Age: stu.Age} // 创建新的Student实例 }
通过以上修改,map
中的每个值将指向不同的内存地址,从而避免了所有值都指向最后一个元素的情况。 运行修改后的代码将得到预期的结果。
希望这个解释能够帮助您理解Go语言中for...range
循环和map
数据结构的细节,并避免此类陷阱。
以上是为什么Go语言中使用for range遍历slice并存入map时,所有值会变成最后一个元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在加密货币交易领域,交易所的安全性始终是用户关注的重点。2025年,经过多年的发展和演变,一些交易所凭借其卓越的安全措施和用户体验脱颖而出。本文将详细介绍2025年最安全的五大交易所,并提供如何避开黑U(黑客攻击用户)的实用指南,确保您的资金100%安全。

go'sfutureisbrightwithtrendslikeMprikeMprikeTooling,仿制药,云 - 纳蒂维德象,performanceEnhancements,andwebassemblyIntegration,butchallengeSinclainSinClainSinClainSiNgeNingsImpliCityInsImplicityAndimimprovingingRornhandRornrorlling。

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

2025年十大数字虚拟币交易APP排行:1. Binance:全球领先,提供高效交易和多种金融产品。2. OKX:创新多样,支持多种交易类型。3. Huobi:稳定可靠,服务优质。4. Coinbase:新手友好,界面简洁。5. Kraken:专业交易者首选,工具强大。6. Bitfinex:高效交易,交易对丰富。7. Bittrex:安全合规,监管合作。

欧意OKX6.118.0版本最新下载教程:1、点击文章中快捷链接;2、点击下载即可(如果是网页用户请先进行信息注册)。最新安卓版本v6.118.0优化了部分功能和体验,让交易更容易。立即更新App,感受更加极致的交易体验。

根据 2025 年权威机构的最新评估和行业趋势,以下是全球十大支持多链交易的加密货币平台,结合交易量、技术创新、合规性及用户口碑综合分析:

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

欧意OKX6.118.0版本最新下载教程:1、点击文章中快捷链接;2、点击下载即可(如果是网页用户请先进行信息注册)。最新安卓版本v6.118.0优化了部分功能和体验,让交易更容易。立即更新App,感受更加极致的交易体验。
