继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

golang 遍历时元素指针问题

慕标5832272
关注TA
已关注
手记 1229
粉丝 229
获赞 1001

问题

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


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP