1. type student struct {
    2. name string
    3. age int
    4. }
    5. func main() {
    6. m := make(map[string]*student)
    7. stus := []student{
    8. {name: "pprof.cn", age: 18},
    9. {name: "测试", age: 23},
    10. {name: "博客", age: 28},
    11. }
    12. //由于每次在stus切片中取出一个元素,复制到stu中,stu的指针是不会变化的
    13. for _, stu := range stus {
    14. fmt.Printf("%p\n",&stu)
    15. m[stu.name] = &stu
    16. }
    17. for k, v := range m {
    18. fmt.Println(k, "=>", v.name)
    19. }
    20. }

    上面代码运行后的结果是?
    image.png
    由于通过for range遍历数据时,会将值拷贝到前面的变量中,而stu的指针是一直不会变化的,那么就会导致上述情况中,结果都是最后一个元素,可以修改为下面这种写法解决这个问题:

    1. type student struct {
    2. name string
    3. age int
    4. }
    5. func main() {
    6. m := make(map[string]*student)
    7. //stus := []student{
    8. stus := []*student{
    9. {name: "pprof.cn", age: 18},
    10. {name: "测试", age: 23},
    11. {name: "博客", age: 28},
    12. }
    13. //由于每次在stus切片中取出一个元素,复制到stu中,stu的指针是不会变化的
    14. for _, stu := range stus {
    15. fmt.Printf("%p\n",stu)
    16. //m[stu.name] = &stu
    17. m[stu.name] = stu
    18. }
    19. for k, v := range m {
    20. fmt.Println(k, "=>", v.name)
    21. }
    22. }

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