前言:
前一段时间看了一下Golang Map的底层实现,发现Golang Map的实现相等复杂,又是数组、Hash表,又是链表、结构体的,还有扩缩容问题。大体结构体图如下:
思考:
这么复杂的过程,我怎么可以直观的看到我的key、value到底存到了哪里,以怎样的结构存储的?这次的map到底被散列到了几个buckets,有没有反生hash碰撞呢?为了解决这个问题,让Golang的使用者更直观的看到map的分布信息。写了
这个项目(注:暂时只支持key和value都是int型的)
项目介绍:
根据Golang Map的实现原理,结合unsafe这个不安全编程包,进行Map内存分布的构造及展示。效果如下:
1、打印Map:可以看到一个已经初始化了map的分布情况
root@echo-ubuntu:/work/go_workspace/src/VGMap# go run main.go
#########################
1:输入key和value
2:随机生成一个Map
3:打印Map
4:清空Map
5:退出
#########################
请选择(1,2,3,4,5):
3
buckets[0]:
|__tophash : [0 0 0 0 0 0 0 0]
|__key : [0 0 0 0 0 0 0 0]
|__values : [0 0 0 0 0 0 0 0]
|__overflow: 0x0
#########################
1:输入key和value
2:随机生成一个Map
3:打印Map
4:清空Map
5:退出
#########################
请选择(1,2,3,4,5):
2、输入key和value:输入key和value后,查看map分布情况
请选择(1,2,3,4,5):
1
请输入key:
8888
请输入value:
77777
buckets[0]:
|__tophash : [112 0 0 0 0 0 0 0]
|__key : [8888 0 0 0 0 0 0 0]
|__values : [77777 0 0 0 0 0 0 0]
|__overflow: 0x0
#########################
1:输入key和value
2:随机生成一个Map
3:打印Map
4:清空Map
5:退出
#########################
请选择(1,2,3,4,5):
3、随机生成一个map:可以看到key被散列到了不同的bucket中,有overflow的发生
请选择(1,2,3,4,5):
2
请输入范围最大值:
30
buckets[0]:
|__tophash : [70 141 239 0 0 0 0 0]
|__key : [15 26 29 0 0 0 0 0]
|__values : [29 33 44 0 0 0 0 0]
|__overflow: 0x0
buckets[1]:
|__tophash : [96 154 187 202 51 0 0 0]
|__key : [4 11 13 19 27 0 0 0]
|__values : [5 12 42 45 55 0 0 0]
|__overflow: 0x0
buckets[2]:
|__tophash : [0 0 0 0 0 0 0 0]
|__key : [0 0 0 0 0 0 0 0]
|__values : [0 0 0 0 0 0 0 0]
|__overflow: 0x0
buckets[3]:
|__tophash : [89 153 146 9 26 0 0 0]
|__key : [0 17 18 20 22 0 0 0]
|__values : [11 22 35 25 30 0 0 0]
|__overflow: 0x0
buckets[4]:
|__tophash : [59 0 0 0 0 0 0 0]
|__key : [28 0 0 0 0 0 0 0]
|__values : [28 0 0 0 0 0 0 0]
|__overflow: 0x0
buckets[5]:
|__tophash : [171 45 168 184 137 233 234 169]
|__key : [1 5 7 9 10 14 16 21]
|__values : [28 23 27 9 24 42 37 27]
|__overflow: 0xc00001e240
|__tophash : [41 0 0 0 0 0 0 0]
|__key : [23 0 0 0 0 0 0 0]
|__values : [51 0 0 0 0 0 0 0]
|__overflow: 0x0
buckets[6]:
|__tophash : [221 4 248 205 0 0 0 0]
|__key : [2 3 8 12 0 0 0 0]
|__values : [19 32 24 24 0 0 0 0]
|__overflow: 0x0
buckets[7]:
|__tophash : [47 113 97 0 0 0 0 0]
|__key : [6 24 25 0 0 0 0 0]
|__values : [31 51 32 0 0 0 0 0]
|__overflow: 0x0