我正在阅读go1.10.3中的map的源代码。似乎存在有关操作的相应方法,例如:
makemap(t *maptype, hint int, h *hmap) *hmap ==> m = make(map[xx]yy)
mapaccess1(t *maptype, h *hmap, key unsafe.Pointer)==> m['key']
但是我找不到添加键/值的操作的对应方法,如下所示:
m['xx']='yy'
存在一种称为mapassign的方法,该方法与此相似 操作。
mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer
这将为地图添加一个新键,但是正如我们所看到的,输入参数没有值。还有一个问题是,当它已经有了此密钥时,它可能会更新此密钥。
if !alg.equal(key, k) {
continue
}
// already have a mapping for key. Update it.
if t.needkeyupdate {//why??
typedmemmove(t.key, k, key)
}
由于两个键相等,为什么要更新它?
摘要:
1.添加键/值操作与方法 mapassign ?
之间的关系
2.为什么在mapassign方法中插入键和已经存在的键相等,为什么可能需要更新键?
答案 0 :(得分:3)
在操作m[k] = v
中,调用方将值v
复制到mapassign
返回的地址。
函数needkeyupdate中的注释解释了为什么某些类型需要键更新:浮点和复数-0和0相等,但是值不同;字符串可能具有较小的后备存储。