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

  • 相关阅读:
    K8S集群组件
    K8S概念
    yaml格式
    Linux下升级openssl
    cpu的核心数及线程关系
    bzoj4941: [Ynoi2016]镜子里的昆虫
    bzoj4940: [Ynoi2016]这是我自己的发明
    bzoj4939: [Ynoi2016]掉进兔子洞
    bzoj4867: [Ynoi2017]舌尖上的由乃
    bzoj 4866: [Ynoi2017]由乃的商场之旅
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14054676.html
Copyright © 2020-2023  润新知