實際上GomapJava7之前的HashMap, 非常相似。都是Array + LinkedTable的結構。

結構

map數據結構由runtime/map.go/hmap定義:

1
2type hmap struct {
3 count     int // 當前保存的元素個數
4 ...
5 B         uint8  // 指示bucket數組的大小
6 ...
7 buckets    unsafe.Pointer // bucket數組指針,數組的大小為2^B
8 ...
9}

bucket數據結構由runtime/map.go/bmap定義:

1
2type bmap struct {
3 tophash [8]uint8 //存儲哈希值的高8位
4 data    byte[1]  //key value數據:key/key/key/.../value/value/value...
5 overflow *bmap   //溢出bucket的地址
6}

這裡使用的數組對齊方式來存放數據。overflow指向下一個bucket.

工作流程

首先通過key計算Hash值,通過Hash的低位,計算出該元素需要存放在buckets中的哪一個bucket. 如果Hash衝突,也就是當前bucket已經有人進去了。那麼就使用該bucketoverflow指向自己的bucket.

查找元素也是大同小異。