【发布时间】:2014-07-29 01:34:37
【问题描述】:
我发现了一些看起来有点奇怪的行为,如果有人能向我解释为什么它会这样工作,那就太好了。
假设我们有一个这样的结构/对象:
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 对象中的地图会成功更新它,所以下次我们从 Game 对象中检索 p 时,p 的地图有新数据,但是当我们更新 p.name 时,它会恢复为除非我们手动将 p 对象添加回 Game 对象的地图,否则旧值?
【问题讨论】: