golang map 是按值查找还是按引用查找?

Posted

技术标签:

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

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

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

type quality struct 
    goodness    int
    crunchiness int 

cookies := make(map[string]quality)
cookies["nutrageous"] = qualitygoodness: 3, crunchiness: 10

我想修改一个条目。

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

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

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

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

【问题讨论】:

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

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

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

【讨论】:

【参考方案2】:

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

Dereferencing a map index in Golang

【讨论】:

以上是关于golang map 是按值查找还是按引用查找?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 是按引用传递还是按值传递? [复制]

JavaScript 是按引用传递还是按值传递语言?

js传参是按值传递还是按引用传递?

.bind(this) 是按引用传递还是按值传递?

Ruby 是按值传递还是按引用传递? [复制]

Swift 函数是按值还是按引用分配/传递?