golang中在遍歷陣列時,要修改陣列中變數無法修改成功的問題
阿新 • • 發佈:2018-11-01
記錄在寫go時遇到的一個小坑
例子:
package main import ( "fmt" ) type UserInfo struct { Name string `json:"name"` UserId int `json:"user_id"` } type Message struct { Type string `json:"type"` Id int `json:"id"` Permission []UserInfo `json:"permission"` } func main(){ Users := []UserInfo{ UserInfo{Name:"b", UserId:2}, UserInfo{Name:"c", UserId:3}, } mdata := &Message{ Type: "a", Id: 1, Permission: Users, } fmt.Println("初始mdata:", mdata) permissions := mdata.Permission for _, p := range permissions { p.UserId = 3 } fmt.Println("第一次修改後mdata:", mdata) for index := range permissions { permissions[index].UserId = 3 } fmt.Println("第二次修改後mdata:", mdata) }
結果輸出:
初始mdata: &{a 1 [{b 2} {c 3}]}
第一次修改後mdata: &{a 1 [{b 2} {c 3}]}
第二次修改後mdata: &{a 1 [{b 3} {c 3}]}
為什麼第一次修改不成功呢?
我想大致原因是第一次修改中的p是另一個複製了permissions中變數的變數。然後第一次修改只是對p中值進行了修改,原始的permissions中的值還沒有修改。所以以後要修改需要用第二種方法,用index找到原始permission中對應的值進行修改。