为什么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)

WorldCoin(WLD)凭借其独特的生物识别验证和隐私保护机制,在加密货币市场中脱颖而出,吸引了众多投资者的目光。 WLD凭借其创新技术,特别是结合OpenAI人工智能技术,在众多山寨币中表现突出。但未来几年,数字资产的走势如何呢?让我们一起预测WLD的未来价格。 2025年WLD价格预测预计2025年WLD将实现显着增长。市场分析显示,WLD平均价格可能达到1.31美元,最高可能触及1.36美元。然而,在熊市情况下,价格可能跌至0.55美元左右。这一增长预期主要源于WorldCoin2.

支持跨链交易的交易所有:1. Binance,2. Uniswap,3. SushiSwap,4. Curve Finance,5. Thorchain,6. 1inch Exchange,7. DLN Trade,这些平台通过各种技术支持多链资产交易。

加密货币市场暴跌引发投资者恐慌,Dogecoin(Doge)成为重灾区之一。其价格大幅下挫,去中心化金融(DeFi)总价值锁定(TVL)也出现显着下降。 “黑色星期一”的抛售潮席卷加密货币市场,Dogecoin首当其冲。其DeFiTVL跌至2023年水平,币价在过去一个月内下跌23.78%。 Dogecoin的DeFiTVL降至272万美元的低点,主要原因是SOSO价值指数下跌26.37%。其他主要DeFi平台,如无聊的Dao和Thorchain,TVL也分别下降了24.04%和20.

Aavenomics是修改AAVE协议令牌并引入令牌回购的提议,已为AAVEDAO实现了一个法定人数。AAVE连锁计划(ACI)创始人马克·泽勒(MarcZeller)在X上宣布了这一点,并指出它标志着该协议的新时代。AAVE连锁倡议(ACI)创始人MarcZeller在X上宣布,Aavenomics提案包括修改AAVE协议令牌和引入令牌回购,已为AAVEDAO实现了法定人数。根据Zeller的说法,这标志着该协议的新时代。AaveDao成员以压倒性的投票支持该提议,即在周三以每周100

选择加密货币交易所的建议:1. 流动性需求,优先选择币安、Gate.io或OKX,因其订单深度与抗波动能力强。2. 合规与安全,Coinbase、Kraken、Gemini具备严格监管背书。3. 创新功能,KuCoin的软质押和Bybit的衍生品设计适合进阶用户。

在加密货币的繁华世界里,新机遇总是不断涌现。当下,KernelDAO (KERNEL) 空投活动正备受瞩目,吸引着众多投资者的目光。那么,这个项目究竟是什么来头?BNB Holder 又能从中获得怎样的好处?别急,下面将为你一一揭晓。

适合新手的加密货币数据平台有CoinMarketCap和非小号。1. CoinMarketCap提供全球加密货币实时价格、市值、交易量排名,适合新手与基础分析需求。2. 非小号提供中文友好界面,适合中文用户快速筛选低风险潜力项目。

2025年在杠杆交易、安全性和用户体验方面表现突出的平台有:1. OKX,适合高频交易者,提供最高100倍杠杆;2. Binance,适用于全球多币种交易者,提供125倍高杠杆;3. Gate.io,适合衍生品专业玩家,提供100倍杠杆;4. Bitget,适用于新手及社交化交易者,提供最高100倍杠杆;5. Kraken,适合稳健型投资者,提供5倍杠杆;6. Bybit,适用于山寨币探索者,提供20倍杠杆;7. KuCoin,适合低成本交易者,提供10倍杠杆;8. Bitfinex,适合资深玩
