Golang map 如何进行删除操作?
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)
}
- map 被清空。执行完之后调用
len
函数,结果肯定是0; - 内存没有释放。清空只是修改了一个标记,底层内存还是被占用了;
- 循环遍历了
len(m)
次。上面的代码每一次遍历都会删除一个元素,而遍历的次数并不会因为之前每次删一个元素导致减少。
如何真正释放内存?
map = nil
这之后坐等垃圾回收器回收就好了。
如果你用 map 做缓存,而每次更新只是部分更新,更新的 key 如果偏差比较大,有可能会有内存逐渐增长而不释放的问题。要注意
Golang map 如何进行删除操作?相关推荐
- go语言map遍历时删除是安全的, 且可以完全删除
结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...
- go语言 sync.map遍历时删除可以全部删除
结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...
- map中的迭代删除操作注意问题
如果map中包含若干个key为10的倍数,要删除key为10的倍数. 错误形式 #include <iostream> #include <map> #include < ...
- map在循环删除时的正确操作
打省赛的时候居然被卡语法了,啊这--虽然不被卡语法还是会T掉,但还是想写篇博客记录一下. map在循环删除时应该这样操作: #include <iostream> #include < ...
- golang map 删除 清空
使用 delete() 函数从 map 中删除键值对 使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下: delete(map, 键) 其中 map 为要 ...
- golang map 删除key后内存不会自动释放,内存泄漏问题
全局map ,会有内存释放问题 package mainimport ("fmt""github.com/thoas/go-funk""math&qu ...
- Golang map 三板斧第二式:注意事项
文章目录 1.默认初始值为 nil 2.range 顺序的随机性 3.引用传递 4.元素不可取址 5.并发读写问题 参考文献 map 使用起来非常方便,但也有些必须要注意的地方,否则可能会导致程序异常 ...
- 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 ...
- stl map高效遍历删除的方法
for(:iter!=mapStudent.end():) { if((iter->second)>=aa) { //满足删除条件,删除当前结点,并指向下面一个结点 mapStudent. ...
最新文章
- 2020校招薪酬大比拼,你被倒挂了没?
- Flutter入门:application、module、package、plugin
- CodeForces - 1287C Garland(贪心)
- ISA Best Practices Analyzer Tool
- 译 | 将数据从Cosmos DB迁移到本地JSON文件
- 实习生解雇_我们解雇了我们的顶尖人才。 我们做出的最佳决定。
- @Builder(toBuilder=true) 链式初始化对象、修改对象
- 详解:hive启动hiveserver2连JDBC报错:Could not open client transport with JDBC Uri 解决方案
- Unity 动态生成mesh圆圈
- Unsatisfied forward or external declaration 错误分析
- Unity3D 性能优化
- 编译和push services.jar的方法
- python玩扫雷_Python玩转算法—扫雷
- 在贫民窟住了 29 年,我成为印度第一个 GitHub star
- 树的遍历(先序、中序、后序详解)
- SqlServer高效汉字转拼音的存储过程
- 下一个风口:正能量算法
- 提取灵格斯里ld2格式词典的内容
- jdbc:mysql连接字符串
- mongodb文档操作1
热门文章
- 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
- HDU - 5316 Magician(线段树区间合并)
- HDU - 3709 Balanced Number(数位dp)
- java可变长字符串类型,Java 常用类——StringBufferamp;StringBuilder【可变字符序列】_IT技术_软件云...
- HDU1016(DFS)
- 基于Windows Socket 的网络通信中的心跳机制原理
- 学习Windows编程遇到的问题
- 再见了 Docker!Go 落地的 K8S 云原生架构已成气候!
- 十一资讯 | 字节跳动进军汽车云;Twitch被黑;Facebook宕机;Netfilx收购游戏公司……...
- 音视频技术开发周刊 | 190