文章首发:公众号 newbmiao
Dig101: dig more, simplified more and know more
map

它作为哈希表,简单易用,既能自动处理哈希碰撞,又能自动扩容或重新内存整理,避免读写性能的下降。

这些都要归功于其内部实现的精妙。本文尝试去通过源码去分析一下其背后的故事。

我们不会过多在源码分析上展开,只结合代码示例对其背后设计实现上做些总结,希望可以简单明了一些。

希望看完后,会让你对 map 的理解有一些帮助。网上也有很多不错的源码分析,会附到文末,感兴趣的同学自行查看下。

(本文分析基于 Mac 平台上go1.14beta1版本。长文预警 ... )

我们先简单过下map实现hash表所用的数据结构,这样方便后边讨论。

文章目录

  • 0x01 map 的内部结构
  • 0x02 map 的 hash 方式
  • 0x03 map 的扩容方式
  • 0x04 map 的初始化
  • 0x05 map 的读取
  • 0x06 map 的赋值
  • 0x07 map 的删除
  • 0x08 map 的遍历

0x01 map的内部结构

在这里我们先弄清楚map实现的整体结构

hmapbucketsbmap
key
bmaptophash
overflow
noverflow,oldbuckets,nevacuate,oldoverflow

具体对应的数据结构详细注释如下:

(虽然多,先大致过一遍,后边遇到会在提到)