我发现了一些看起来有点奇怪的行为,如果有人能向我解释为什么它会这样工作就太好了。
假设我们有一个这样的结构/对象:
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 ,否则旧值?