map 原理

本文详细介绍了Go语言中map的实现原理,包括哈希表的使用、key的定位、赋值更新删除操作、遍历特性以及扩容机制。特别强调了map的无序性、非线程安全性和key的支持类型。同时,文中提到了并发情况下使用map的潜在风险及避免策略。
摘要由CSDN通过智能技术生成

本文大部分内容摘抄自 Go Questions.

在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value> 对组成的抽象数据结构,并且同一个 key 只会出现一次。
有两个关键点:是由 key-value 对组成的;key 只会出现一次。

哈希查找表用一个哈希函数将 key 分配到不同的桶(bucket,也就是数组的不同 index)。这样,开销主要在哈希函数的计算以及数组的常数访问时间。在很多场景下,哈希查找表的性能很高。

哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般的处理方法是链表法。链表法将一个 bucket 实现成一个链表,落在同一个 bucket 中的 key 都会插入这个链表。

map 实现原理
// A header for a Go map.
type hmap struct {
   
       // 元素个数,调用 len(map) 时,直接返回此值
	count     int
       // 如值为 1 表明有 goroutine 正在进行写操作(以阻止多 goroutine 同时操作 map)
       flags     uint8
       // buckets 的对数 log_2	
       B         uint8
       // ...
 
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值