map
Go的map底层是用hash表实现的。
支持字面量初始化和内置函数make初始化。
m := map[string]int{"apple" : 2,"banana" : 3,}
m := make(map[string]int, 10)
make初始化map时指定容量可以有效减少内存分配的次数,有利于提升性能。
map的增删改查操作
m := make(map[string]string, 10)
m["apple"] = "red"
m["apple"] = "green"
delete(m, "apple")
v, exist := m["apple"] // v表示“apple”对呀的value, exist表示m中是否存在“apple”这个key。
多协程操作同一个map会产生读写冲突而引发panic;
未初始化的map值为nil,向值为nil的map添加元素时也会触发panic。
需要并发读写map可以加锁(Mutex,RWMutex)或者直接使用sync.Map。
map底层数据结构
type hmap struct {
count int // 当前保存元素的个数
B uint8 // bucket数组大小
buckets unsafe.Pointer // bucket数组,长度为2^B
oldbuckets unsafe.Pointer // 大小为一半旧的bucket数组,仅用于扩容
}
buckets中存放了2^B个bucket,hash桶