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

  • 相关阅读:
    NetBeans 时事通讯(刊号 # 4 Apr 22, 2008)
    设计演化与设计
    关于奥普迪词典软件竞赛的一点体会、抱怨与建议
    关于奥普迪词典软件竞赛的一点体会、抱怨与建议
    Ubuntu8.04已经可以索要免费CDs了!
    NetBeans 时事通讯(刊号 # 3 Apr 15, 2008)
    SQL行列转换
    STL中map用法详解
    MFC 网络编程 总结 .
    Visual C++内存泄露检测—VLD工具使用说明 .
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14054676.html
Copyright © 2011-2022 走看看