【问题标题】:Is golang map lookup by value or by reference?golang map 是按值查找还是按引用查找?
【发布时间】:2016-12-08 08:36:24
【问题描述】:

当我从 Go 中的映射中检索结构时,我会得到值的副本吗?还是我得到地图中的实际值?

例如,假设我有一个从字符串到结构的映射:

type quality struct {
    goodness    int
    crunchiness int 
}
cookies := make(map[string]quality)
cookies["nutrageous"] = quality{goodness: 3, crunchiness: 10}

我想修改一个条目。

我可以指望返回的值与地图中的值相同吗?

c := cookies["nutrageous"]
c.goodness += 5

或者我是否也必须返回并修改地图中的内容?

c := cookies["nutrageous"]
c.goodness += 5
cookies["nutrageous"] = c

【问题讨论】:

  • 因为在 Go 中 没有 没有引用,答案显然是:按值。
  • 我很好重新打开这个,因为你已经接受了一个答案(认为关闭会阻止持续的反对票)。但是,答案的根本原因是相同的,因此很高兴了解为什么当地图中的值一开始无法寻址时,您的示例可能无法工作。
  • 所以我和你的答案是一样的,即使这些问题源于同样的潜在信息缺乏。但是关于 SO 的知识需要按问题进行索引,这些是不同的索引 - 即使两个问题指向相同的答案,它们仍然会为网站增加价值。

标签: dictionary go pass-by-reference pass-by-value


【解决方案1】:

索引地图会返回地图值的副本。如果映射值是一个结构,那么对返回的结构值的修改不会改变映射中的结构值。您必须将修改后的值分配回地图。

如果值是指向结构的指针,则可以通过存储在映射中的指针访问对结构的修改。

【讨论】:

    【解决方案2】:

    就像 Cerise 的回答一样,这是不可能的。 相反,您可以将指针作为值保存在映射中。

    Dereferencing a map index in Golang

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2010-09-22
      • 2011-10-28
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多