zoukankan      html  css  js  c++  java
  • golang 执行for 遍历时取value的指针时容易出错

    package main
    
    import (
        "log"
        "time"
    )
    
    type student struct {
        Name string
        Age  int
    }
    
    func main() {
        m := make([]*student, 3)
        stus := []student{
            student{Name: "sa", Age: 10},
            student{Name: "sb", Age: 11},
            student{Name: "sc", Age: 12},
        }
    
        log.Println("################ 错误做法 ##################")
        for k, stu := range stus {
            m[k] = &stu
        }
        for _, s := range m {
            log.Println(s.Name, s.Age)
        }
    
        log.Println("################ 正确做法 ##################")
        for k, _ := range stus {
            m[k] = &stus[k]
        }
        for _, s := range m {
            log.Println(s.Name, s.Age)
        }
        time.Sleep(2 * time.Second)
    }

    2018/12/12 12:24:19 ################ 错误做法 ##################
    2018/12/12 12:24:19 sc 12
    2018/12/12 12:24:19 sc 12
    2018/12/12 12:24:19 sc 12
    2018/12/12 12:24:19 ################ 正确做法 ##################
    2018/12/12 12:24:19 sa 10
    2018/12/12 12:24:19 sb 11
    2018/12/12 12:24:19 sc 12


    for k, stu := range stus 变量stu 的地址并不会随着遍历而改变,所以&stu 对应的值始终为stus的最后的元素
  • 相关阅读:
    20210420
    20210419
    2021041601
    20210416
    20210415
    20210414
    20210413
    20210412
    20210409
    20210405
  • 原文地址:https://www.cnblogs.com/forgo/p/13418114.html
Copyright © 2011-2022 走看看