go语言的map多协程访问时需要加锁吗go语言的map多协程访问时需要加锁
支持==和!=操作就可以做key,实际上只有function、map、slice三个kind不支持作为key,因为只能和nil比较不能和另一个值比较 。布尔、整型、浮点、复数、字符串、指针、channel等都可以做key 。
struct能不能做key要看每一个字段,如果所有字段都可以做key,那这个struct就可以 。有一个字段不能做key,这个struct就不能做key 。array也是,元素类型能做key,那这个array就可以 。
例如:
type Foo map[struct {
Bbool
Iint
Ffloat64
Ccomplex128
Sstring
P*Foo
Ch chan Foo
}]bool
每一个字段都可以做key,Foo就可以做key 。再如:
type Foo map[struct {
Fn func() Foo
Mmap[*Foo]int
S[]Foo
}]bool
有一个字段不能做key、Foo就不允许做key,而这三个字段都不能 。
字段是递归检查的:
type Foo map[struct {
Sub struct {
M map[*Foo]bool
}
}]bool
Sub的M字段不能做key , Sub就不能做key,Foo也就不能做key 。
总之想把一个数据结构用于map的key,就不能包含function、map和slice 。
goland map底层原理map 是Go语言中基础的数据结构,在日常的使用中经常被用到 。但是它底层是如何实现的呢?
总体来说golang的map是hashmap,是使用数组+链表的形式实现的,使用拉链法消除hash冲突 。
golang的map由两种重要的结构,hmap和bmap(下文中都有解释) , 主要就是hmap中包含一个指向bmap数组的指针,key经过hash函数之后得到一个数,这个数低位用于选择bmap(当作bmap数组指针的下表),高位用于放在bmap的[8]uint8数组中,用于快速试错 。然后一个bmap可以指向下一个bmap(拉链) 。
Golang中map的底层实现是一个散列表,因此实现map的过程实际上就是实现散表的过程 。在这个散列表中,主要出现的结构体有两个,一个叫 hmap (a header for a go map) , 一个叫 bmap (a bucket for a Go map,通常叫其bucket) 。这两种结构的样子分别如下所示:
hmap :
图中有很多字段,但是便于理解map的架构,你只需要关心的只有一个,就是标红的字段: buckets数组。Golang的map中用于存储的结构是bucket数组 。而bucket(即bmap)的结构是怎样的呢?
bucket :
相比于hmap , bucket的结构显得简单一些 , 标红的字段依然是“核心”,我们使用的map中的key和value就存储在这里 。“高位哈希值”数组记录的是当前bucket中key相关的“索引”,稍后会详细叙述 。还有一个字段是一个指向扩容后的bucket的指针,使得bucket会形成一个链表结构 。例如下图:
由此看出hmap和bucket的关系是这样的:
而bucket又是一个链表,所以 , 整体的结构应该是这样的:
哈希表的特点是会有一个哈希函数,对你传来的key进行哈希运算,得到唯一的值,一般情况下都是一个数值 。Golang的map中也有这么一个哈希函数,也会算出唯一的值,对于这个值的使用,Golang也是很有意思 。
Golang把求得的值按照用途一分为二:高位和低位 。
如图所示 , 蓝色为高位,红色为低位 。然后低位用于寻找当前key属于hmap中的哪个bucket,而高位用于寻找bucket中的哪个key 。上文中提到:bucket中有个属性字段是“高位哈希值”数组 , 这里存的就是蓝色的高位值 , 用来声明当前bucket中有哪些“key”,便于搜索查找 。需要特别指出的一点是:我们map中的key/value值都是存到同一个数组中的 。数组中的顺序是这样的:
并不是key0/value0/key1/value1的形式,这样做的好处是:在key和value的长度不同的时候,可 以消除padding(内存对齐)带来的空间浪费。
推荐阅读
- 直播工具组合图,直播工具叫什么
- MP3下载下载,mp3下载免费版
- phpcms支持大型网站吗,phpcms使用教程
- css3自动生成兼容代码,css 兼容
- 安卓可以使用go语言吗 安卓可以用google play吗
- 苹果手机转安卓王者荣耀,苹果手机转安卓王者荣耀还能转回来吗
- jquery页面滑动遮盖,jquery滑动到最底部
- go语言列队 go 队列
- 电脑上能用什么手柄,什么电脑游戏可以用手柄玩