记录在写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中对应的值进行修改。