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

来源:3-4 Map

beginnerv

2022-10-11 21:14:56

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://img.mukewang.com/climg/634568b109f7407a06140192.jpg

有时

https://img.mukewang.com/climg/63456b53095b518105380164.jpg

写回答

1回答

ccmouse

2022-10-15

代码我格式化了一下:

https://img.mukewang.com/climg/634a6e5d0911ea1d08060360.jpg


这里有两个混淆的地方,

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

https://img.mukewang.com/climg/634a6ebc09f310d508020224.jpg

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

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

h022-10-15
共1条回复

0 学习 · 1399 问题

查看课程