map
mapmaphmapa headerfora go mapbmapa bucketforaGomapbucket
mapbmap

bucket:

hmapmap
hmapbucket

而bucket又是一个链表,所以,整体的结构应该是这样的:

map

Golang把求得的值按照用途一分为二:高位和低位。

hmapmap

并不是key0/value0/key1/value1的形式,这样做的好处是:在key和value的长度不同的时候,可以消除padding带来的空间浪费。

map
的扩容

当以上的哈希表增长的时候,Go语言会将bucket数组的数量扩充一倍,产生一个新的bucket数组,并将旧数组的数据迁移至新数组。

加载因子

加载因子
加载因子加载因子加载因子
加载因子加载因子map加载因子
  1. map长度 / 2^B

6.5Bmap加载因子mapoldbucket
map
map

注意:这里并不会直接删除旧的bucket,而是把原来的引用去掉,利用GC清除内存。

中数据的删除
mapmap
  1. 1、如果``key``是一个指针类型的,则直接将其置为空,等待GC清除;

  2. 2、如果是值类型的,则清除相关内存。

  3. 3、同理,对``value``做相同的操作。

  4. 4、最后把key对应的高位值对应的数组index置为空。