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.返回新设置的元素。

  • 相关阅读:
    用带缓冲区的文件流FileStream来实现大文件的拷贝
    委托与事件、匿名方法与Lambda表达式
    C#基础点记录
    C#基础知识06
    用while语句实现用户登陆程序
    TSQL检索电话呼叫员的工作流水信息
    委托
    类型转换、异常、String知识总结
    内网入库单管理系统
    用C#打印出正等腰三角形
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14054676.html
Copyright © 2011-2022 走看看