Pointers 更改结构值

Pointers 更改结构值,pointers,go,struct,Pointers,Go,Struct,玩golang,不明白为什么我不能在userGroup结构中更改用户的电子邮件 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 *userG

玩golang,不明白为什么我不能在userGroup结构中更改用户的电子邮件

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)
}
主程序包
输入“fmt”
类型用户结构{
名称、电子邮件字符串
}
func(u*用户)更改电子邮件(新电子邮件字符串){
u、 电子邮件=新电子邮件
}
类型userGroup结构{
用户映射[int]用户
}
func(ug*用户组)映射overusers(fn func(u*用户)){
usersLen:=len(ug.users)
对于i:=0;i
我检查过了,我相信我在内存中引用了
ug
(用户组)和
u
(用户)的相同地址。也许这不是正确的方法,只是边走边读一本书,边走边尝试简单的事情。谢谢。

电话线

usr := ug.users[i]
在地图中创建用户的副本。此副本已修改。有两种方法可以解决这个问题。第一个是在地图中存储指向用户的指针:

type userGroup struct {
    users map[int]*user
}

第二个是在修改后将值存储回地图:

    usr := ug.users[i]
    fn(&usr)
    ug.users[i] = usr