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

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

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 ,否则旧值?