Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2020-11-28:go中,map的写流程是什么?

2020-11-28:go中,map的写流程是什么?

原创
作者头像
福大大架构师每日一题
修改于 2020-11-30 06:29:13
修改于 2020-11-30 06:29:13
4390
举报

福哥答案2020-11-28:

源码位于runtime/map.go文件中的mapassign函数。

info"name"="福大大"

bilibili视频里的步骤:答案来自此链接

3.结合哈希因子和键name生成哈希值。

5.获取哈希值的后B位,并根据后B位的值来决定将此键值对存放到哪个桶中(bmap)。

6.在上一步确定桶之后,接下来就在同种写入数据。

获取哈希值的tophash(即:哈希值的高8位),将tophash、key、value分别写入到桶中的上数组中。

如果桶已满,则通过overflow找到溢出桶,并在溢出桶中继续写入。

注意:以后再桶中查找数据时,会基于tophash来找(tophash相同则再去比较key)。

7.hmap的个数count++(map中的元素个数+1)。

看源码新增了一些步骤,忽略扩容:

1.如果map为nil,抛panic。

2.如果flags是【正在写】状态,抛throw。

3.结合哈希因子和键name生成哈希值。

4.修改flags为【正在写】状态。

5.获取哈希值的后B位,并根据后B位的值来决定将此键值对存放到哪个桶中(bmap)。

6.在上一步确定桶之后,接下来就在同种写入数据。

获取哈希值的tophash(即:哈希值的高8位),将tophash、key、value分别写入到桶中的上数组中。

如果桶已满,则通过overflow找到溢出桶,并在溢出桶中继续写入。

注意:以后再桶中查找数据时,会基于tophash来找(tophash相同则再去比较key)。

7.hmap的个数count++(map中的元素个数+1)。

8.如果flags不处于【正在写】状态,说明是并发写,抛throw。

9.修改flags,取消【正在写】状态。

10.返回新设置的元素。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2020-11-27:go中,map的读流程是什么?
源码位于runtime/map.go文件中的mapaccess1函数和mapaccess2函数。
福大大架构师每日一题
2020/11/27
3950
由浅到深,入门Go语言Map实现原理
把自己学习知识进行一个总结。同时把一些可能困难、复杂难以理解的东西自我消化吸收后,简单化输出,降低他人的学习成本,提高他人的学习效率,主要为如下两点:
用户1093396
2020/12/23
9680
由浅到深,入门Go语言Map实现原理
由浅到深,入门Go语言Map实现原理
本篇文章主要以Map的读来展开分析,因为读弄明白了,其他的写、更新、删除等基本操作基本都可以猜出来了,不是么。
twelvecoder
2021/12/24
4410
由浅到深,入门Go语言Map实现原理
golang源码分析:map
map 是由 key-value 对组成的;key 只会出现一次.主要的数据结构有两种:哈希查找表(Hash table)、搜索树(Search tree)。哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般有两种应对方法:链表法和开放地址法。搜索树法一般采用自平衡搜索树,包括:AVL 树,红黑树。
golangLeetcode
2022/08/02
4960
Golang map 三板斧第三式:实现原理
Go map 底层实现方式是 Hash 表(C++ map 基于红黑树实现,而 C++ 11 新增的 unordered_map 则与 Go map 类似,都是基于 Hash 表实现)。Go map 的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放 8 个 key/value 对。key 的 Hash 值低位用于在该数组中定位到桶,而高 8 位则用于在桶中区分 key/value 对。
恋喵大鲤鱼
2020/11/12
7.5K0
Golang map 三板斧第三式:实现原理
2万字图解map
上面引用的是维基百科对map的定义,意思是说,在计算机学科中,map是一种抽象的数据结构,它由key和value组成组成键值对的集合,在集合中每个key最多出现一次。像关联数组、符号表、字典数据结构都是map的一种具体实现 map数据结构在实际的项目使用的非常频繁,很多语言都提供了mpa数据结构,像Java语言的HashMap,Go语言中的map和sync.Map数据类型。map基本操作包含添加key和value键值对,获取key对应的value, 删除key,遍历操作。
数据小冰
2022/08/15
1.1K0
2万字图解map
深入理解 Go map:初始化和访问元素
从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方?
李海彬
2019/05/08
1.5K0
深入理解 Go map:初始化和访问元素
GO 中 map 的实现原理
要是对 GO 的slice 原理还有点兴趣的话,欢迎查看文章 GO 中 slice 的实现原理
阿兵云原生
2023/02/16
5010
深入理解 Go map:赋值和扩容迁移
在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章
李海彬
2019/05/08
2.6K0
深入理解 Go map:赋值和扩容迁移
《Go小技巧&易错点100例》第四十篇
未恢复的 panic 会逐级向上传递,最终导致整个程序崩溃,所有协程(包括主协程)都会终止,崩溃表现:
闫同学
2025/07/14
820
go哈希
哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般有两种应对方法:链表法和开放地址法。链表法将一个 bucket 实现成一个链表,落在同一个 bucket 中的 key 都会插入这个链表。开放地址法则是碰撞发生后,通过一定的规律,在数组的后面挑选“空位”,用来放置新的 key。
Michel_Rolle
2023/11/06
3.4K1
2020-11-25:go中,map的底层数据结构是什么?
福哥答案2020-11-25: 简单回答:hmap映射头、bmap桶、mapextra溢出额外信息 中级回答: // 映射头 type hmap struct { // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. // Make sure this stays in sync with the compiler's definition. count int // map
福大大架构师每日一题
2020/11/25
7170
go map 原理与并发安全map
go map 整体和 java hashmap 差不多, 只是源码阅读的位置不太方便
leobhao
2024/11/29
1640
go map 原理与并发安全map
深入理解Go语言中的map
哈希表和数组是最常见的数据结构,几乎所有的语言都会有数组和哈希表两种容器类型 。哈希表表示的是键值对之间映射关系,在Go语言中,通过map来表示哈希表。 本文将深入浅出介绍map的概念、使用方式、底层结构、性能、最佳实现等话题,帮助开发更好的理解和使用map。
windealli
2024/03/21
3170
深入理解Go语言中的map
如何设计并实现一个线程安全的 Map ?(上篇)
Map 是一种很常见的数据结构,用于存储一些无序的键值对。在主流的编程语言中,默认就自带它的实现。C、C++ 中的 STL 就实现了 Map,JavaScript 中也有 Map,Java 中有 HashMap,Swift 和 Python 中有 Dictionary,Go 中有 Map,Objective-C 中有 NSDictionary、NSMutableDictionary。
一缕殇流化隐半边冰霜
2018/08/30
2.1K0
如何设计并实现一个线程安全的 Map ?(上篇)
golang 系列:深入认识 map!
map 通过 hasTable 实现了我们最常见的 key-value 存储,能快速的对数据集增删查改。同时 Go 里的 map 也有很多特殊的地方,比如它的无序性、并发不安全等。今天,就让我们对 map 进行深入研究,看看它是怎么设计的。
lincoln
2021/08/04
7060
Golang Map
渐进式扩容:扩容并非一次性完成所有桶迁移,而是在map操作时分多次完成迁移,防止性能瞬时抖动
Arata
2022/10/25
2750
真希望你也明白runtime.Map和sync.Map
One of the most useful data structures in computer science is the hash table. Many hash table implementations exist with varying properties, but in general they offer fast lookups, adds, and deletes. Go provides a built-in map type that implements a hash table.
面向加薪学习
2022/12/13
4210
真希望你也明白runtime.Map和sync.Map
深入理解Go语言中的map:结构、性能与最佳实践
哈希表和数组是最常见的数据结构,几乎所有的语言都会有数组和哈希表两种容器类型 。哈希表表示的是键值对之间映射关系,在Go语言中,通过map来表示哈希表。本文将深入浅出介绍map的概念、使用方式、底层结构、性能、最佳实现等话题,帮助开发更好的理解和使用map。
windealli
2024/03/22
3.4K0
深入理解Go语言中的map:结构、性能与最佳实践
深度解密Go语言之map
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。
梦醒人间
2019/05/23
1.2K0
相关推荐
2020-11-27:go中,map的读流程是什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档