zoukankan      html  css  js  c++  java
  • 2020-11-28:go中,map的写流程是什么?

    福哥答案2020-11-28:

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

    info["name"]="福大大"

    bilibili视频里的步骤:[答案来自此链接](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=11)
    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.返回新设置的元素。

  • 相关阅读:
    【类的继承与派生】学习笔记
    c++类的学习笔记
    c++链表
    实验六--类和对象
    mission3--dp
    POJ2718Smallest Difference(暴力全排列)
    我也不知道该起什么标题....
    noip2014题解
    Windows平台整合SpringBoot+KAFKA__第2部分_代码编写前传
    Windows平台整合SpringBoot+KAFKA_第1部分_环境配置部分
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14054676.html
Copyright © 2011-2022 走看看