为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Go

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

}


※计算桶号

https://img1.sycdn.imooc.com//631b71a70001b36817170885.jpg

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


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

https://img1.sycdn.imooc.com//631b739f0001760a09180559.jpg

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


课程收获:

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



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
2
获赞与收藏
4

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消