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

  • 相关阅读:
    建模:确定服务的边界——《微服务设计》读书笔记
    linux & windows下重启oracle
    Git配置用户名与邮箱
    Git中使用amend解决提交冲突
    微服务架构师的职责——《微服务设计读书笔记》
    MAC下配置ssh让SourceTree通过秘钥访问远程仓库
    微服务的概念——《微服务设计》读书笔记
    Uva 11572 唯一的雪花
    Codeforces Round #404 (Div. 2) ABC
    tyvj 1031 热浪 最短路
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14054676.html
Copyright © 2011-2022 走看看