首页 > 其他分享 >Golang map 的底层原理

Golang map 的底层原理

时间:2022-09-30 11:05:01浏览次数:75  
标签:map key bucket value Golang bmap 数组 底层

前言

本文介绍 golang 中 map 的实现方式, 希望对读者和我有所帮助

结构

map是 go 语言中的基础的数据结构, 在寻找指定key时, 复杂度是O(1), 在某些场景能发挥很大的作用

golang 的 map 是 hashmap, 实现方式是数组+链表, 并且使用拉链法来取消 hash 的冲突

map 主要有两个核心的数据结构, hmapbmap(bucket), 为什么说他核心呢? 因为 map 的实现就是依靠这两个结构体

hmap的结构有以下几个字段

  • 元素个数: int
  • flags: uint8
  • 扩容字段: uint8
  • 溢出的 bucket 数量: uint16
  • 用于扩容的指针: *mapextra
  • buckets 数组指针: unsafa.Pointer
  • 搬迁进度: uintptr
  • 扩容时用于复制的 buckets 数组: unsafe.Pointer
  • hash seed: uint32

这里你需要重点了解的是buckets 数组指针, 也就是bmap, 那么bmap的结构如下

  • 高位哈希: [8]uint8
  • 字节数组(存储 key 和 value 的数组): []bytes
  • 指向扩容 bucket 的指针: pointer

bmap字节数组中, 存储了我们真正的keyvalue

高位哈希中存储了key的索引

指向扩容 bucket 的指针则存储了下一个bmap的位置, 所以说 bucket 是链表形式

对于bmap中的字节数组部分存储这个bmap里面的所有keyvalue, 他是一个数组, 里面存储的结构是这样的

key0, key1, key2, value0, value1, value2

是将所有的 keykey排在一起,valuevalue排在一起

这是为了内存对齐, 目的是减少空间浪费

也就是说, hmap的结构应该是

		       hmap
														
bmap0  bmap1  bmap2
|      |      |
bmap3  bmap4  bmap5
|      |      |

这种关系(我真是灵魂画手

标签:map,key,bucket,value,Golang,bmap,数组,底层
From: https://www.cnblogs.com/chnmig/p/16744163.html

相关文章

  • Golang 的锁
    前言go语言的锁,一说大家都知道,一个是互斥锁Mutex,一个是读写互斥锁RWMutex,用起来很简单,但是要想在技术上更进一步,还是需要了解其原理基础知识进程同步既然......
  • sync.map 原理分析
    普通的map普通的map并不是并发安全的,但是在go的1.6之前不会报错,但是会出现问题,1.6之后会直接报错.例如以下代码:packagemainimport( "fmt" "time")fun......
  • MyBaris-ResultMap定制化查询结果
    MyBatis的ResultMap通常来说,数据库的命名规范一般是​​xxx_xxx​​​这样子,而Java的属性命名方式一般是采用的​​小驼峰命名​​​,即eName,empNo…这样的。而MyBatis的自动......
  • Golang 常问知识点(简略)
    前言稍微记录一下问题点吧,文章会不断的优化更新有些比较大的知识点,比如锁原理啥的,会单独拎出来写一篇,这里只是大概Go语言的基础数据类型占用大小类型大小......
  • 基于OMAPL138+FPGA的多路PWM发生器设计及应用
    为了满足一种新能源发电领域的电力电子变换装置上逆变器触发的要求,研制了利用OMAPL138和FPGA实现的多路PWM脉冲发生器。该脉冲发生器利用接口单元接收OMAPL138写入的PWM脉......
  • 基于OMAP-L138 DSP+ARM处理器与FPGA实现SDR软件无线电系统
    信迈公司的某客户需要针对多个应用开发一个扩频无线电收发器。该客户已经开发出一套算法,准备用于对信号进行调制和解调,但他们却缺少构建完整系统的资源和专业知识。客户希望......
  • 水声通信软件无线电OMAP平台的硬件设计与实现
    水声通信作为水下唯一远距离无线通信方式,是实现水下综合信息感知与信息交互的主要手段。而水声信道的时延、多普勒双重扩展以及时变特性给高速率高可靠性通信带来了极大的......
  • 基于OMAPL138 +FPGA 48通道采集器的设计与实现
    当今局势下,世界人口形势进一步加剧,由于陆地资源和环境的压力,海洋客观上已成为世界后备资源基地及某些主要战略资源的接替区。人类为了更加深入的探索海洋,在水声领域引入......
  • omapl138 fpga三核高速数据采集处理核心平台方案
    支持32路AD采集,32路DA输出。支持多路RS485、RS232串口;支持实时系统,控制延时;支持DSP和ARM的多核通信,提供丰富的采样demo;支持图形界面编程,触控!1.OMAP-L138+FPGA开发板简介 ......
  • 抽象工厂模式 Golang
    参考链接练习:设计一个电脑主板架构,电脑包括(显卡,内存,CPU)3个固定的插口,显卡具有显示功能(display,功能实现只要打印出意义即可),内存具有存储功能(storage),cpu具有计算功能(calcul......