关于map遍历取地址赋值问题

关于map遍历取地址赋值问题

func main(){
x := map[int]string{1:"a", 2:"b", 3:"c"}
r := make([]*string, 0, len(x))
for _, v := range x {
r = append(r, &v)
}
for _, v := range r {
fmt.Println(*v)
}
}

老师可以讲讲,为啥下面有时会输出ccc,有时会输出bbb的原理吗?

输出

https://img1.sycdn.imooc.com//climg/634568b109f7407a06140192.jpg

有时

https://img1.sycdn.imooc.com//climg/63456b53095b518105380164.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
ccmouse 2022-10-15 16:29:02

代码我格式化了一下:

https://img1.sycdn.imooc.com//climg/634a6e5d0911ea1d08060360.jpg


这里有两个混淆的地方,

一:map的遍历顺序是不固定的。哪怕下面的代码,每次输出的也不一样。

https://img1.sycdn.imooc.com//climg/634a6ebc09f310d508020224.jpg

二:这里通过range x赋值的v变量不是map里面元素的地址,而是 一个 string类型的局部变量,每次进入for循环体,会把map中的下一个元素复制到v中。因此同学的代码打出来的始终是3个相同的字母。至于到底是哪个,这个都可以。

  • 提问者 beginnerv #1

    谢谢老师,原来这样啊,遍历获取是string类型的局部变量,并不是map里面元素的地址。

    2022-10-15 17:15:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师