golang 執行for 遍歷時取value的指標時容易出錯
阿新 • • 發佈:2020-08-02
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的最後的元素