go1.10.3中添加键/值与mapassign方法之间的关系

时间:2018-11-04 10:03:55

标签: dictionary go

我正在阅读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方法中插入键和已经存在的键相等,为什么可能需要更新键?

1 个答案:

答案 0 :(得分:3)

  1. 在操作m[k] = v中,调用方将值v复制到mapassign返回的地址。

  2. 函数needkeyupdate中的注释解释了为什么某些类型需要键更新:浮点和复数-0和0相等,但是值不同;字符串可能具有较小的后备存储。