jus*_*tem 2 struct pointers go
玩golang并且不明白为什么我不能在userGroup struct中更改用户的电子邮件.
package main
import "fmt"
type user struct {
name, email string
}
func (u *user) changeEmail(newEmail string) {
u.email = newEmail
}
type userGroup struct {
users map[int]user
}
func (ug *userGroup) mapOverUsers(fn func(u *user)) {
usersLen := len(ug.users)
for i := 0; i < usersLen; i++ {
usr := ug.users[i]
fn(&usr)
}
}
func main() {
ug := userGroup{
map[int]user{0: {"0", "ZZZ"}, 1: {"1", "ZZZ"}, 2: {"2", "ZZZ"}}}
fmt.Println(ug)
// should be same as (&ug).mapOverUsers
ug.mapOverUsers(func(u *user) {
u.changeEmail("XXX")
fmt.Println(u)
})
fmt.Println(ug)
}
Run Code Online (Sandbox Code Playgroud)
我查了一下,我相信我在ug(userGroup)和u(user)的内存中引用了相同的地址.也许这不是正确的方法,只是随时随地读一本书并尝试简单的事情.谢谢.
这条线
usr := ug.users[i]
Run Code Online (Sandbox Code Playgroud)
在地图中创建用户的副本.此副本已修改.有两种方法可以解决这个问题.第一个是在地图中存储指向用户的指针:
type userGroup struct {
users map[int]*user
}
Run Code Online (Sandbox Code Playgroud)
第二种是在修改后将值存储回地图:
usr := ug.users[i]
fn(&usr)
ug.users[i] = usr
Run Code Online (Sandbox Code Playgroud)