栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Go不允许使用地图值地址?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Go不允许使用地图值地址?

让我们从这个虚假的声明开始:

我想就地修改地图结构值。可以使用++或+ =等运算符在适当的位置修改地图中的数值

 func icandothis() {    cmap := make(map[int]complex64)    cmap[1] += complex(1, 0)    fmt.Println(cmap[1]) }

让我们扩展简写形式:

package mainimport (    "fmt")func icandothisShort() {    cmap := make(map[int]complex64)    cmap[1] += complex(1, 0)    fmt.Println(cmap[1])}func icandothisLong() {    cmap := make(map[int]complex64)    // An assignment operation x op= y where op is a binary arithmetic operator    // is equivalent to x = x op (y) but evaluates x only once.    // cmap[1] += complex(1, 0)    v := cmap[1]          // v = zero value = complex(0, 0)    v = v + complex(1, 0) // v = complex(0, 0) + complex(1, 0) = complex(1, 0)    cmap[1] = v// cmap[1] = v = complex(1, 0)    a := cmap[1]          // a = complex(1, 0)    fmt.Println(a)        // complex(1, 0)}func main() {    icandothisShort()    icandothisLong()}

游乐场:https://play.golang.org/p/1OgmI_AD9uN

输出:

(1+0i)(1+0i)

您可以在中看到

icandothisLong()
的扩展形式
icandothisShort()
,没有就地更新。



下一个虚假声明,

就像切片一样,映射由内存结构(可能包括数组)支持。

那么,为什么我不能使用映射值的地址的真正原因是什么?


真正的原因是您不了解地图数据结构。

存储桶存储结构支持地图。映射键通过不完美的动态哈希标识当前的主存储桶。映射键和值存储在主存储桶或溢出存储桶中。随着创建,更新和删除地图条目,地图存储区会不断进行重组。地图条目在内存中没有固定的位置。

做一些基础研究。例如,

GopherCon 2016:Keith Randall-地图实施内部



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403812.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号