Go语言map、slice、channel底层实现(go面试)

news/2024/4/29 18:34:36

slice

切片是一个引用类型,其底层实现是一个结构体,包含以下字段:

ptr:一个指向底层数组的指针,指针指向数组的第一个元素。
len:切片当前包含的元素数量。
cap:切片的容量,即底层数组从切片的起始位置到底层数组末尾的元素数量。

Map

map 的底层实现是一个哈希表(hash table),实际上是维护一个数组,它通过将键映射到一个固定大小的数组(桶)中,然后在每个桶中存储对应的值。通过哈希函数,可以将键转换为数组索引,从而快速定位到对应的桶。
如何解决哈希冲突:每个桶存储了一个链表或红黑树,用于解决哈希冲突(多个键映射到同一个桶的情况)在哈希表(hash table)中,桶(bucket)是用于存储键值对的容器。每个桶可以存储一个或多个键值对。

map 的底层数据结构是 hmap 结构体:

type hmap struct {count     int #表示当前 map 中的键值对数量。flags     uint8 #表示一些标志位,用于标识 map 的状态和特性。B         uint8 #表示桶的数量的对数。B 的值决定了哈希表的大小,即桶的数量为 2^B。noverflow uint16 #表示溢出桶的数量,即哈希冲突时使用的额外桶的数量hash0     uint32 #表示哈希种子值,用于计算键的哈希值buckets    unsafe.Pointer #是一个指向桶数组的指针,存储了实际的键值对数据oldbuckets unsafe.Pointer #是一个指向旧的桶数组的指针,用于扩容时的过渡状态nevacuate  uintptr #表示正在迁移的桶的数量,即正在从旧桶迁移到新桶的过程中的桶数量extra *mapextra #是一个指向额外信息的指针,用于存储一些额外的数据
}

map底层如何删除一个键值对:

delete(mp, "name")

从底层角度讲,分为以下几个步骤

1:根据key计算哈希,值找到对应的桶
2:在桶中遍历链表或者红黑树找到对应节点
3:根据链表or红黑树的规则删除节点
4:删除节点后,桶中没有其他节点了,将桶置为 nil,表示该桶为空
5:更新 map 的计数器count,将键值对的数量减一

懂得了如何删除,插入和查询大概流程也是这样,插入先检查有无节点,有则更新,无则插入并且对count++,查询直接遍历就行

channel

通道底层数据结构是 hchan 结构体

type hchan struct {qcount   uint           // 当前队列中的元素个数dataqsiz uint           // 缓冲区的大小buf      unsafe.Pointer // 缓冲区的指针elemsize uint16         // 元素的大小closed   uint32         // 通道是否已关闭的标志elemtype *_type         // 元素的类型sendx    uint           // 发送操作的索引recvx    uint           // 接收操作的索引recvq    waitq          // 接收操作的等待队列sendq    waitq          // 发送操作的等待队列lock     mutex          // 互斥锁
}

这里对channel的操作遇到注意几个点:
对已经关闭的通道写入:报错
对已经关闭的通道读取:(1)若通道有数据:数据照样读取出来
(2)若通道无数据:返回通道类型的零值和false

最后,学习一项数据结构或者技巧,我们不仅仅要掌握如何使用,最好要了解他们背后的原理,这样可以加深对其的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/11822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

方案分享 | 嵌入式指纹方案

随着智能设备的持续发展,指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势,被广泛地运用在智能门锁、智能手机、智能家居等设备上。 我们推荐的品牌早已在2015年进入指纹识别应用领域&#xff…

【干货】零售商的商品规划策略

商品规划,无疑是零售业的生命之源,是推动业务腾飞的强大引擎。一个精心策划的商品规划策略,不仅能帮助零售商在激烈的市场竞争中稳固立足,更能精准捕捉客户需求,实现利润最大化。以下,我们将深入探讨零售商…

C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。

C Primer(第5版) 练习 11.14 练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。 环境:Linux Ubuntu(云服务器&#x…

【超简单】基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?当您面对成吨的会议录音,着急写会议纪要而不得不愚公移山、人海战术?听的头晕眼花,听的漏洞百出,听的怀疑人生,那么你…

开启 Keep-Alive 可能会导致http 请求偶发失败

大家好,我是蓝胖子,说起提高http的传输效率,很多人会开启http的Keep-Alive选项,这会http请求能够复用tcp连接,节省了握手的开销。但开启Keep-Alive真的没有问题吗?我们来细细分析下。 最大空闲时间造成请求…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…