問(wèn)題
golang 執(zhí)行for 遍歷時(shí)取value的指針時(shí)容易出錯(cuò)
代碼實(shí)現(xiàn)
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("################ 錯(cuò)誤做法 ##################")
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 ################ 錯(cuò)誤做法 ##################
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 的地址并不會(huì)隨著遍歷而改變,所以&stu 對(duì)應(yīng)的值始終為stus的最后的元素