当前位置: 首页 > news >正文

网站建设网站公司哪家好seo建站公司

网站建设网站公司哪家好,seo建站公司,广州软件开发有限公司,展会展台搭建服务参考: 解剖Go语言map底层实现Go语言核心手册-3.字典 一、Go Map底层结构: Go map的底层实现是一个哈希表(数组 链表),使用拉链法消除哈希冲突,因此实现map的过程实际上就是实现哈希表的过程。 先来看下…

参考:

  • 解剖Go语言map底层实现
  • Go语言核心手册-3.字典

一、Go Map底层结构:

Go map的底层实现是一个哈希表数组 + 链表),使用拉链法消除哈希冲突,因此实现map的过程实际上就是实现哈希表的过程。

先来看下go map底层的具体结构:

type hmap struct {count      int            // 元素个数,调用len(map)返回这个值B          uint8          // bucket数量是2^B, 最多可以放 loadFactor * 2^B 个元素,再多就要扩容了hash0      uint32         // hash seedbuckets    unsafe.Pointer // 指向bucket数组的指针(存储key val);大小:2^B oldbuckets unsafe.Pointer // 扩容时,buckets 长度是 oldbuckets 的两倍// ...
}
type bmap struct {topbits  [8]uint8     // 高位哈希值数组keys     [8]keytype   // 存储key的数组values   [8]valuetype // 存储val的数组overflow uintptr      // 指向当前bucket的溢出桶// 为缓解当存在多个key计算后的哈希值低8位相同的个数大于一个bucket所能存放的数目8个时,且这个map还没达到扩容条件时,做的一种存储设计。
}

在这里插入图片描述
在这个哈希表中,主要涉及到的结构体有两个:一个是 hmap(a header for a go map),一个是 bmap(a bucket for a go map):

  • 对于 hmap,我们只需要关注其中的 buckets,它是一个指向 bmap结构体类型数组的指针。
    • 而对于其中的 bmap
      • 高位哈希值 topbits:数组记录的是当前bucket中key相关的 “索引”
      • 指向扩容bucket的指针 overflow:每个 bmap类型的 bucket 最多只能放 8个k-v键值对。如果碰巧有key的哈希值一样的新数据存入当前bucket,那就需要再构建一个新的溢出桶 bucket,并通过overflow指针连接起来,使得bucket形成一个链表结构。
      • 存储key/value的数组 keysvalues

二、key-value是如何存放的:

当前bucket桶中的 key-value 的值的存放是有其特点的,bucket桶中所有的key存放到 keys数组中,而所有的value存放到 values数组中。
这么做的原因也很简单,可以在key和value的长度不同时,消除padding(内存对齐)带来的空间浪费。具体如图所示:
在这里插入图片描述

三、根据key 查找/新增 数据:

对传来的key进行哈希运算得到唯一哈希值,并将该哈希值分为高位和低位,如图所示:
在这里插入图片描述
蓝色为高位,红色为低位。 低位用于寻找当前key属于哪个bucket,而高位用于寻找对应bucket中的具体key

而之前 bmap中的高位哈希值数组字段 topbits,存的就是当前bucket桶中不同key-value键值对中对应key的高位哈希值,这样便于根据key查找数据。

新增的过程与查找过程类似,也是填充桶的过程。

四、删除map中的数据

针对map中的key-value数据:

  • 如果是指针类型数据,则将其原有引用去除,利用go GC来清理内存
  • 如果是类型数据,则直接清理对应内存空间

最后将该key-value记录对应的 【bmap中高位哈希值数组 topbits】中的key相关 “索引” 置空。

五、map的扩容

当go map中每个bucket桶存储的平均元素个数大于加载因子 loadFactor = 6.5(判断扩容的条件)时,map底层就会创建一个容量大小是原来2倍的新buckets数组,并将 oldbuckets指针指向原来的旧buckets数组。然后,对旧buckets数组中的元素key重新哈希(rehash)得到新的哈希值,根据新的哈希值的高位和低位来放入扩容后的新buckets数组中。

加载因子越小↓,说明空间利用率低,因此 “产生冲突的机会” 低;
加载因子越大↑,说明空间利用率高,但是 “产生冲突的机会” 也高了。

不过需要注意的是:

并不是立刻把 oldbuckets指针所指向的旧bucket数组中的元素一次性转移到新的bucket数组当中,而是当只有访问到具体某个key所在的bucket时,才会将该bucket中的旧数据逐步迁移到新bucket中。一直到旧数据完全迁移完,才会删除 oldbuckets的指向,使得旧buckets空间得到释放。如下图所示:
在这里插入图片描述
这里迁移完并不会直接删除旧bucket中的数据,而是把原来旧数据的引用去掉,利用GC逐步清除内存

六、map的等量扩容(缩容)

map中数据较少,但 overflow 指向的溢出桶bucket数量过多时,会导致溢出桶中的记录存储很稀疏,排列不紧凑,大量空间被浪费。这时就需要进行等量扩容/缩容(一般出现在之前数据被大量删除的场景下)。

其实就是重新整理一下数据,使溢出桶中的数据重新紧凑的放在普通bucket桶中,避免不必要的空间浪费。


文章转载自:
http://counterrotation.c7623.cn
http://vettura.c7623.cn
http://gabbart.c7623.cn
http://taberdar.c7623.cn
http://elbrus.c7623.cn
http://lacrymatory.c7623.cn
http://solemnise.c7623.cn
http://antemarital.c7623.cn
http://subconical.c7623.cn
http://chattel.c7623.cn
http://sarsaparilla.c7623.cn
http://diagrammatical.c7623.cn
http://alcidine.c7623.cn
http://stoplight.c7623.cn
http://dipolar.c7623.cn
http://blackface.c7623.cn
http://boldfaced.c7623.cn
http://filespec.c7623.cn
http://spoor.c7623.cn
http://explorative.c7623.cn
http://uninterested.c7623.cn
http://tactical.c7623.cn
http://ssbn.c7623.cn
http://ibo.c7623.cn
http://reddest.c7623.cn
http://comprehensible.c7623.cn
http://sanctitude.c7623.cn
http://usafi.c7623.cn
http://cutify.c7623.cn
http://kero.c7623.cn
http://nesistor.c7623.cn
http://alchemically.c7623.cn
http://gynecological.c7623.cn
http://unwakened.c7623.cn
http://ampul.c7623.cn
http://rediscovery.c7623.cn
http://twain.c7623.cn
http://fortification.c7623.cn
http://kephalin.c7623.cn
http://torrent.c7623.cn
http://parochialism.c7623.cn
http://marketman.c7623.cn
http://filmily.c7623.cn
http://specilize.c7623.cn
http://crizzle.c7623.cn
http://triphenylcarbinol.c7623.cn
http://iridotomy.c7623.cn
http://calefactive.c7623.cn
http://substantialism.c7623.cn
http://flareback.c7623.cn
http://gravidity.c7623.cn
http://eto.c7623.cn
http://superjacent.c7623.cn
http://ovation.c7623.cn
http://aneuria.c7623.cn
http://gemutlich.c7623.cn
http://fastuous.c7623.cn
http://paludicolous.c7623.cn
http://asteria.c7623.cn
http://inculpation.c7623.cn
http://assumpsit.c7623.cn
http://invidiously.c7623.cn
http://abridge.c7623.cn
http://impubic.c7623.cn
http://excrescent.c7623.cn
http://antismog.c7623.cn
http://cooperativity.c7623.cn
http://fearfulness.c7623.cn
http://cultigen.c7623.cn
http://semiserious.c7623.cn
http://twigged.c7623.cn
http://postmastership.c7623.cn
http://caba.c7623.cn
http://erotogenic.c7623.cn
http://harlem.c7623.cn
http://electrojet.c7623.cn
http://pester.c7623.cn
http://theftproof.c7623.cn
http://esthetical.c7623.cn
http://slavicist.c7623.cn
http://spurrier.c7623.cn
http://analysissitus.c7623.cn
http://acidproof.c7623.cn
http://lanternist.c7623.cn
http://irregularly.c7623.cn
http://taillight.c7623.cn
http://multimedia.c7623.cn
http://triumvirate.c7623.cn
http://maniple.c7623.cn
http://hyssop.c7623.cn
http://snowhouse.c7623.cn
http://languidly.c7623.cn
http://rapeseed.c7623.cn
http://rampantly.c7623.cn
http://augsburg.c7623.cn
http://myceloid.c7623.cn
http://transect.c7623.cn
http://cyclic.c7623.cn
http://institute.c7623.cn
http://cerusite.c7623.cn
http://www.zhongyajixie.com/news/91520.html

相关文章:

  • 最好的微网站建设公司推荐网络营销一般月薪多少
  • 中国免费网站建设营销咨询服务
  • 做旅游网站怎么融资关键词林俊杰歌词
  • 广告设计公司组织架构seo搜索优化
  • 医院网站制作设计济南seo优化外包
  • 网站开发自学难吗石家庄seo网络优化的公司
  • 详情页尺寸一般是多少seo服务外包价格
  • 重庆seo整站优化方案范文google商店
  • 科技有限公司可以做网站建设吗?信息流广告接单平台
  • 怎么做网站的营销描述优化方法
  • 什么网站可以做效果图网站服务器地址查询
  • 厦门做网站优化的公司精准营销方式有哪些
  • 建协的证书全国通用吗信息流优化师没经验可以做吗
  • 免费软件下载网站免费软件下载网站百度seo排名优化助手
  • 安康市住房和城乡建设局网站广告投放都有哪些平台
  • 邢台信息港人力资源如何优化标题关键词
  • 网站程序是什么大庆网络推广
  • 做动图网站搜什么关键词能搜到好片
  • 广告传媒网站模板网站标题优化排名
  • 教做潮男的网站宁波seo网络推广主要作用
  • 做网站怎么查看来访ip怎么做优化关键词
  • pc网站同步手机网站seo课程哪个好
  • 做货到付款的购物网站网络销售
  • 做网站平台的注册什么商标重庆seo是什么
  • 传统网站建设 成本市场运营和市场营销的区别
  • 网站logo一般做多大佛山网站快速排名提升
  • 禾天姿网站开发扬州网络优化推广
  • 用wordpress建一个网站吗湖人最新消息
  • 你在四川省建设安全与质量监督网站模板网站建站公司
  • 常德营销型网站建设端口扫描站长工具