map 的删除操作

Golang 内置了哈希表,总体上是使用哈希链表实现的,如果出现哈希冲突,就把冲突的内容都放到一个链表里面。

Golang 还内置了delete函数,如果作用于哈希表,就是把 map 里面的 key 删除。

delete(intMap, 1)

map 的删除原理

可以直接看源码。

我简单摘几行:

func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {for ; b != nil; b = b.overflow(t) {for i := uintptr(0); i < bucketCnt; i++ {b.tophash[i] = emptyh.count--}}
}

外层的循环就是在遍历整个 map,删除的核心就在那个empty。它修改了当前 key 的标记,而不是直接删除了内存里面的数据。

empty          = 0 // cell is empty

如何清空整个 map

看了我上面的分析,那么这段代码可以清空 map 么?

for k, _ := range m {delete(m, k)
}
  1. map 被清空。执行完之后调用len函数,结果肯定是0;
  2. 内存没有释放。清空只是修改了一个标记,底层内存还是被占用了;
  3. 循环遍历了len(m)次。上面的代码每一次遍历都会删除一个元素,而遍历的次数并不会因为之前每次删一个元素导致减少。

如何真正释放内存?

map = nil

这之后坐等垃圾回收器回收就好了。

如果你用 map 做缓存,而每次更新只是部分更新,更新的 key 如果偏差比较大,有可能会有内存逐渐增长而不释放的问题。要注意

Golang map 如何进行删除操作?相关推荐

  1. go语言map遍历时删除是安全的, 且可以完全删除

    结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...

  2. go语言 sync.map遍历时删除可以全部删除

    结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...

  3. map中的迭代删除操作注意问题

    如果map中包含若干个key为10的倍数,要删除key为10的倍数. 错误形式 #include <iostream> #include <map> #include < ...

  4. map在循环删除时的正确操作

    打省赛的时候居然被卡语法了,啊这--虽然不被卡语法还是会T掉,但还是想写篇博客记录一下. map在循环删除时应该这样操作: #include <iostream> #include < ...

  5. golang map 删除 清空

    使用 delete() 函数从 map 中删除键值对 使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下: delete(map, 键) 其中 map 为要 ...

  6. golang map 删除key后内存不会自动释放,内存泄漏问题

    全局map ,会有内存释放问题 package mainimport ("fmt""github.com/thoas/go-funk""math&qu ...

  7. Golang map 三板斧第二式:注意事项

    文章目录 1.默认初始值为 nil 2.range 顺序的随机性 3.引用传递 4.元素不可取址 5.并发读写问题 参考文献 map 使用起来非常方便,但也有些必须要注意的地方,否则可能会导致程序异常 ...

  8. Golang map 三板斧第三式:实现原理

    文章目录 1.数据结构 1.1 简介 1.2 核心结构 1.3 数据结构图 2.实现机制 2.1 创建 2.2 增加或修改 2.3 删除 2.4 查找 2.5 迭代 2.5.1 hiter 2.5.2 ...

  9. stl map高效遍历删除的方法

    for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指向下面一个结点 mapStudent. ...

最新文章

  1. 2020校招薪酬大比拼,你被倒挂了没?
  2. Flutter入门:application、module、package、plugin
  3. CodeForces - 1287C Garland(贪心)
  4. ISA Best Practices Analyzer Tool
  5. 译 | 将数据从Cosmos DB迁移到本地JSON文件
  6. 实习生解雇_我们解雇了我们的顶尖人才。 我们做出的最佳决定。
  7. @Builder(toBuilder=true) 链式初始化对象、修改对象
  8. 详解:hive启动hiveserver2连JDBC报错:Could not open client transport with JDBC Uri 解决方案
  9. Unity 动态生成mesh圆圈
  10. Unsatisfied forward or external declaration 错误分析
  11. Unity3D 性能优化
  12. 编译和push services.jar的方法
  13. python玩扫雷_Python玩转算法—扫雷
  14. 在贫民窟住了 29 年,我成为印度第一个 GitHub star
  15. 树的遍历(先序、中序、后序详解)
  16. SqlServer高效汉字转拼音的存储过程
  17. 下一个风口:正能量算法
  18. 提取灵格斯里ld2格式词典的内容
  19. jdbc:mysql连接字符串
  20. mongodb文档操作1

热门文章

  1. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
  2. HDU - 5316 Magician(线段树区间合并)
  3. HDU - 3709 Balanced Number(数位dp)
  4. java可变长字符串类型,Java 常用类——StringBufferamp;StringBuilder【可变字符序列】_IT技术_软件云...
  5. HDU1016(DFS)
  6. 基于Windows Socket 的网络通信中的心跳机制原理
  7. 学习Windows编程遇到的问题
  8. 再见了 Docker!Go 落地的 K8S 云原生架构已成气候!
  9. 十一资讯 | 字节跳动进军汽车云;Twitch被黑;Facebook宕机;Netfilx收购游戏公司……...
  10. 音视频技术开发周刊 | 190