首页 > 编程语言 >go源码解析-map

go源码解析-map

时间:2023-11-10 12:22:48浏览次数:32  
标签:扩容 map hash buckets bucket 因子 源码 go

map

简介

golang的map主要是基于hash-bucket实现

demoMap:=make(int,len)

type hmap struct {
	// Note: the format of the hmap is also encoded in cmd/compile/internal/reflectdata/reflect.go.
	// Make sure this stays in sync with the compiler's definition.
	count     int // # live cells == size of map.  Must be first (used by len() builtin)
	flags     uint8
	B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
	noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
	hash0     uint32 // hash seed

	buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
	oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
	nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated) 迁移阶段,下一个桶编号

	extra *mapextra // optional fields
}

其中:
count: 当前map中元素的个数
B: 当前map中bucket的个数
buckets: mapa当前bucket指针
oldbuckets: 旧桶指针,存在于桶扩容期间

扩容

渐进式扩容

装载因子=元素数量/桶数量 即 len(buckets)=2^B

当装载因子大于等于6.5时,会触发扩容,扩容后的桶数量为原来的2倍

每个桶bmap可存储8个元素,桶会记录下一个桶和extra桶,

溢出桶用于降低扩容频率

  • 装载因子大于6.5

  • 使用太多溢出表

翻倍扩容:负载因子 >6.5
等量扩容:负载因子未超标但溢出桶太多。主要出现在大量删除后,桶中元素过少,但溢出桶过多

存储

key进行哈希计算,

Hash(key)=hash ----> [0,m-1]

  • 取模法: hash%m

  • 与运算: hash&(m-1) m必须是2的幂,否则会出现一些桶始终无法选中

标签:扩容,map,hash,buckets,bucket,因子,源码,go
From: https://www.cnblogs.com/erfeng/p/17823714.html

相关文章

  • 基于Hadoop的物品租赁系统的设计与实现-计算机毕业设计源码+LW文档
    开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器数据库:DROPTABLEIFEXISTSaboutus;/*!40101SET@saved_cs_client=@@character_set_cl......
  • 2023-08-24:请用go语言编写。给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续
    2023-08-24:请用go语言编写。给定一个长度为n的数组arr,现在你有一次机会,将其中连续的K个数全修改成任意一个值,请你计算如何修改可以使修改后的数列的最长不下降子序列最长。请输出这个最长的长度。最长不下降子序列:子序列中的每个数不小于在它之前的数。1<=k,n<=10^5,1<=a......
  • Go 设计模式中中介者模式
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen) 中介者模式原理详细解释:中介者模式(MediatorPattern)是一种行为型设计模式,用于降低多个对象之间的直接通信,并使......
  • Go 设计模式中观察者模式
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)          观察者模式原理详细解释:观察者模式(ObserverPattern)是一种行为型设计模式,它定义了......
  • Golang锁简单使用
    golang主要有两种锁:互斥锁和读写锁互斥锁Mutex用于提供一种加锁机制(LockingMechanism),保证同一时刻只有一个goroutine在临界区运行packagemainimport( "fmt" "sync" "time")funcmain(){ varmutexsync.Mutex x:=0 gofunc(){ mutex.Lock() x=x+1......
  • Golang服务端断线重连
    断线重连的逻辑很简单,就是把用户存到服务器内存中,当客户端再次登录的时候,判断内存中是否有用户的值,有的话替换packagemainimport( "fmt" "github.com/gorilla/websocket" "log" "net/http" "sync" "time")typeClientstruct{ conn*we......
  • 缺乏底层知识的空中楼阁之——HashMap
    HashMapHashMap是基于哈希表对Map接口的实现HashMap提供所有可选的映射操作,允许使用空键空值newHashMap<>().put(null,null)当存在多个线程同时写入HashMap时,可能会导致数据的不一致 HashMap的底层实现: loadFactorthresholdsizemodCountINITLAL_CAPACITYHashMap......
  • 记录使用mongotemplete关于时间查询时的大坑
    1、问题:在使用条件查询mongdb数据库的时候,涉及到使用时间范围来查询数据,比如当时使用的是:1990-01-01T00:00:00到1900-02-02T00:00:00查询的是1月1号到1月2号两天的数据,但是在使用Query.query(criteria);进行查询的时候,和使用Aggregation.match(criteria);进行查询得出的结果不......
  • Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据
    最近DOTS发布了正式的版本,我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据,方便大家上手学习掌握UnityDOTS开发。SystemAPI.Query的使用System有两种,一种是Unmanaged的ISystem,一种是managed的SystemBase,这两种System都可以通过SystemAPI.Query来迭代与......
  • Go 面向接口编程
    接口有什么用?就是存储未实现的方法,作为实现的此方法的结构体的实例的句柄。typeSayerinterface{ say()}typeDogstruct{}typeCatstruct{}func(*Dog)say(){ fmt.Println("Woewwoew")}func(*Cat)say(){ fmt.Println("Meowmeow")}funcmain(){ va......