golang 遍历时元素指针问题

问题

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的最后的元素

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,740评论 0 38
  • 文/徐小木 2016-11-15 Air war 空中大战 Balancing the ticket 优势...
    徐小木阅读 3,916评论 1 1
  • “你不是坏人,只是你也算不上是好人。”——《火柴人》 世上好人和坏人没有严格地定义,真正的好人和十...
    一芽Eva阅读 2,555评论 0 1
  • 平凡是普通又很伟大的两个字 我生活在普通的家庭,爸妈很平凡 可是我的生活既简单又快乐 爸妈给了我很多我不能想象的爱...
    大静晓静大美静阅读 1,443评论 0 1
  • 【2050年8月8日,上海】 今天是我去神奇诊所复诊的日子。 前一天晚上睡得很晚,可是丝毫不影响我的精神状态。早上...
    心心萤火虫阅读 1,904评论 0 0