手记

【九月打卡】第5天 学习go语言--map(2)

课程名称:深入Go底层原理,重写Redis中间件实战


课程章节:4-5 map:重写 Redis 能用它吗?(二)


课程讲师:Moody


课程内容:

创建map用的是 makemap方法

 // 初始化一个hmap结构体

h = new(hmap)

.........

var nextOverflow *bmap

// 创建桶和溢出桶

h.buckets, nextOverflow = makeBucketArray(t, h.B, nil)

if nextOverflow != nil {

//溢出桶存放在 extra结构体中的nextOverflow

//nextOverflow是个指针,指向下一个可用的溢出桶

h.extra = new(mapextra)

h.extra.nextOverflow = nextOverflow

}


※计算桶号

把key和hash0取hash值,hash值会转换为2进制,如果当前桶的数量是8,那么B应该是3,如果B是3,那么就取二进制的哈希值的后三位,后三位表示的数字就是桶号


※tophash记录的是hash值的高8位

得到高八位后就去桶里找对应的key,如果hash碰撞很厉害,那么就穷举往下找,如果桶里的数据已经遍历完,就看有没有溢出桶,一直把所有的溢出桶也给遍历完,真的没有就说明没有这个key


课程收获:

学习了map的底层的一些知识,开始对go的map有一个直观的了解



0人推荐
随时随地看视频
慕课网APP