```
package main
import "fmt"
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)
}
}
```
这段代码为何会显示
![image.png](https://static.studygolang.com/210908/9da1209be2b5080df27c65c26a8ce04a.png)
`for _, stu := range stus {
m[stu.name] = &stu
}`</br>
三次循环复用的是同一个stu变量,你对这个stu取指针并赋值到m中,就导致m中三个key映射的都是stu。</br>
在最后一次循环中,stu被赋值为“博客”,所以最后三个key打印出来的都是“博客”。</br>
要解决这个问题,最简单而且不影响原有逻辑的方法是每次循环都定义一个局部变量:</br>
`for _, stu := range stus {
stu := stu
m[stu.name] = stu
}`</br>
或者通过下标访问切片:</br>
`for i := range stus {
m[stus[i].name] = stus[i]
}`
#12
更多评论