前言:

前一段时间看了一下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

参考资料: