gpt4 book ai didi

pointers - 改变结构值

转载 作者:IT王子 更新时间:2023-10-29 01:26:55 26 4
gpt4 key购买 nike

正在玩 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(用户组)和 u(用户)引用了相同的地址。也许这不是正确的方法,只是一边看书一边尝试简单的事情。谢谢。

最佳答案

线

usr := ug.users[i]

在 map 中创建用户的副本。此副本已修改。有两种方法可以解决这个问题。第一个是在 map 中存储指向用户的指针:

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

playground example

第二种是将修改后的值存回map:

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

playground example

关于pointers - 改变结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37083991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com