Go 语言中map底层原理

Go 语言中map的底层原理!

前言:

​ Go面试技术点。用于记录学习复习总结。

在Go语言中map的定义:

​ map是一种关联数组,它提供了常数级别内进行存取、删除和判断一个键是否存在的操作。map的底层是哈希表,也称为散列表。

Go语言中map的底层实现:

  • 当我们创建一个空map时,Go会在内存中分配一块连续的区域来存储桶(bucket)。每一个桶存储了key-value对中的一个key和相应的value值,并通过哈希函数将每一个key映射到其对应的桶中;
  • 当我们插入一个元素时,哈希函数将用于计算其key的哈希值,并根据这个哈希值确定该元素所在的桶。如果两个不同的key哈希至相同的值,那么它们就认为是“哈希冲突”,此时Go会使用链表解决冲突。每一个桶会指向一个链表,将所有哈希冲突的key-value对链接在同一个链表上;
  • 当我们查找元素时,需要计算其key的哈希值并定位到对应的桶,然后在对应桶的链表中搜索对应的元素。由于链表的长度可能很长,因此Go采用了微调技术来将访问时间控制在常数级别。当桶中存储的键值对数量超过一定阈值时,Go会重新分配更大的一块内存,并将哈希表中所有的键值重新插入到新的桶中;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRHGgBNF-1681636818183)(C:\Users_niuzai\Desktop\map冲突.png)]

微调技术的理解:

  • 在 Go 的 Map 中,微调技术(Fine-Grained Goroutine-Safe Dynamic Map Growth Technique)是用于解决哈希冲突问题,并实现并发安全的 Map 扩容的一种技术;
  • 当Map中出现了哈希冲突时,程序需要在桶中开辟新的节点,并将当前元素插入到这个新节点中。为了保证并发访问的正确性,在对桶进行操作时,Go使用锁进行同步。但是如果整个哈希表是由一个锁,那么这样就会导致在多个goroutine同时尝试执行Map操作时出现竞争、阻塞和延迟等问题。这样不仅降低了Map操作性,还可能导致程序崩溃或出现死锁等问题;
  • 为了避免这些问题,Go中Map使用了微调技术。它将锁颗粒从整个哈希表降低到每一个桶(bucket),这说明每次只有一个goroutine可以获取到该桶的锁。当多个goroutine尝试对不同的桶进行操作时,它们之间不会产生任何冲突和竞争。这样Map的扩容和元素插入可以操作可以并行执行,同时也提高了Map的并发性能和可伸缩性。

​ 注意:需要注意的是,map 的迭代顺序是不确定的,并且在键或值类型为引用类型的情况下,当其映射的变量在 map 中作为 key 映射多个值时,可能会出现问题。因此,在使用 map 进行编程时,我们需要特别小心并仔细考虑其设计和使用方式。

总结

​ 使用map注意的是:map 的迭代顺序是不确定的,并且在键或值类型为引用类型的情况下,当其映射的变量在 map 中作为 key 映射多个值时,可能会出现问题。因此,在使用 map 进行编程时,我们需要特别小心并仔细考虑其设计和使用方式。总而言之,就是无序性和唯一性。

细考虑其设计和使用方式。总而言之,就是无序性和唯一性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值