继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕九州9237533
关注TA
已关注
手记 43
粉丝 2
获赞 4

课程名称:深入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

}


※计算桶号

http://img3.mukewang.com/631b71a70001b36817170885.jpg

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


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

http://img.mukewang.com/631b739f0001760a09180559.jpg

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


课程收获:

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



打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP