问题
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