更改结构值

玩 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)

}

我检查了一下,我相信我在内存中为ug(userGroup)和u(user)引用了相同的地址。也许这不是正确的方法,只是边看书边尝试简单的事情。谢谢你。


慕少森
浏览 133回答 1
1回答

至尊宝的传说

usr := ug.users[i]在地图中创建用户的副本。此副本已修改。有两种方法可以解决此问题。首先是在地图中存储指向用户的指针:type userGroup struct {&nbsp; &nbsp; users map[int]*user}第二种是将修改后的值存储回地图:&nbsp; &nbsp; usr := ug.users[i]&nbsp; &nbsp; fn(&usr)&nbsp; &nbsp; ug.users[i] = usr
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go