手记

golang 遍历时元素指针问题

问题

golang 执行for 遍历时取value的指针时容易出错

代码实现

package mainimport (    "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的最后的元素



作者:火头陀
链接:https://www.jianshu.com/p/dbd81a7c2bcb


0人推荐
随时随地看视频
慕课网APP