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)
}
}
这段代码为何会显示
有疑问加站长微信联系(非本文作者)

先把代码格式化一下
@jthmath 麻烦帮我看看
因为你用的指针类型,循环时把stu赋值给一个新变量或者拷贝stu然后取地址就正常了
够烂面试题不考算法,不考原理,专考这么烂坑的目的是什么? 害怕简历上写的八年golang项目经验全是假的,用烂坑来验证一下
@delaywu 能解释一下么,大佬说的话我没理解
for i := range stus { m[stu.name] = &stus[i] }
stu引用的指针,只会保存最后1个变量的地址
这个坑还是挺容易踩的,我一直劝身边人用slice[i]而不是_,v的v
最好的避坑方法就是:
*
都用*
一个用一个不用,自己把自己绕迷
这个不是range常见的坑吗,打印下它们的地址,都是一样的
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] }
记住不要在for-range中对value和key取地址就好
代码不要随便乱写
够烂在最常用的基础数据类型上都有这么严重的坑 仍然挡不住码农追捧够烂 真是够烂虐我千百遍,我待够烂如初恋
阴阳怪气