type student struct {name stringage int}func main() {m := make(map[string]*student)stus := []student{{name: "pprof.cn", age: 18},{name: "测试", age: 23},{name: "博客", age: 28},}//由于每次在stus切片中取出一个元素,复制到stu中,stu的指针是不会变化的for _, stu := range stus {fmt.Printf("%p\n",&stu)m[stu.name] = &stu}for k, v := range m {fmt.Println(k, "=>", v.name)}}
上面代码运行后的结果是?
由于通过for range遍历数据时,会将值拷贝到前面的变量中,而stu的指针是一直不会变化的,那么就会导致上述情况中,结果都是最后一个元素,可以修改为下面这种写法解决这个问题:
type student struct {name stringage int}func main() {m := make(map[string]*student)//stus := []student{stus := []*student{{name: "pprof.cn", age: 18},{name: "测试", age: 23},{name: "博客", age: 28},}//由于每次在stus切片中取出一个元素,复制到stu中,stu的指针是不会变化的for _, stu := range stus {fmt.Printf("%p\n",stu)//m[stu.name] = &stum[stu.name] = stu}for k, v := range m {fmt.Println(k, "=>", v.name)}}

通过输出的内存地址可以验证这个结果
