map类型在Go运行时层的实现

map类型在Go运行时层的实现

map类型在Go运行时层的实现 #

Go 运行时使用一张哈希表来实现抽象的 map 类型。运行时实现了 map 类型操作的所有功能,包括查找、插入、删除等。在编译阶段,Go 编译器会将 Go 语法层面的 map 操作,重写成运行时对应的函数调用。大致的对应关系是这样的:

// 创建map类型变量实例
m := make(map[keyType]valType, capacityhint)
    m := runtime.makemap(maptype, capacityhint, m)
// 插入新键值对或给键重新赋值
m["key"] = "value"
    v := runtime.mapassign(maptype, m, "key") v是用于后续存储value的空间的地址
// 获取某键的值
v := m["key"]       v := runtime.mapaccess1(maptype, m, "key")
v, ok := m["key"]   v, ok := runtime.mapaccess2(maptype, m, "key")
// 删除某键
delete(m, "key")    runtime.mapdelete(maptype, m, key)

这是 map 类型在 Go 运行时层实现的示意图:

Viewpoint #

From #

16|复合数据类型:原生map类型的实现机制是怎样的?