gpt4 book ai didi

Golang 更新对象中的映射和变量

转载 作者:IT王子 更新时间:2023-10-29 02:05:58 25 4
gpt4 key购买 nike

我发现了一些看起来有点奇怪的行为,如果有人能向我解释为什么它会这样工作就太好了。

假设我们有一个这样的结构/对象:

type Game struct {
players map[string]Profile
}

type Profile struct {
name string
things map[string]string
}

现在让我们稍后再说,我们像这样调用一个 Game 方法:

func (g *Game) someMethod(playerName string) {
p, _ := g.players[playerName]
fmt.Println("P Name: " + p.name)
fmt.Println("Map contents: " + p.things["something"])

// let's assume here p.name currently equals "bob" and p.things["something"] currently equals "this"

p.name = "fred"
p.things["something"] = "that"
}

我们第一次调用 someMethod() 时,p.name 等于“bob”,p.things[“something”] 等于“this”。更新值后,如果我们仍在方法内立即再次检查它们,p.name 将等于“fred”,p.things 将等于“that”。

然而,下次我们调用此方法时,p.things 仍将等于“that”,但 p.name 返回等于“bob”,而不是更新后的值“fred”。我发现的唯一方法是在 p.name 更新后添加此代码:

g.players[playerName] = p

所以,我的问题是,为什么更新 p 对象中的 map 会成功更新它,以便下次我们从 Game 对象中检索 p 时,p 的 map 具有新数据,但是当我们更新 p.name 时,它​​会恢复为除非我们手动将 p 对象添加回 Game 对象的 map ,否则旧值?

最佳答案

someMethod 中的

p 是配置文件结构的副本。如果要更新 map 中的配置文件,则需要使用指针和类型为 map[string]*Profile

的 map

至于p.things,即使p 是结构的副本,映射本身也包含对基础日期的引用。换句话说,您不需要指向 map 的指针来操作它的内容,而且您很少使用指向 map 的指针。

关于Golang 更新对象中的映射和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006961/

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