09 | 字典的操作和约束
该思维导图由 AI 生成,仅供参考
知识前导:为什么字典的键类型会受到约束?
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Go语言中字典类型的特性和使用限制。首先介绍了字典类型的特点,以及键类型受到约束的原因,重点讨论了在选择键类型时需要考虑的性能因素。文章指出,对于基本类型、指针类型以及宽度较小的类型,其哈希和判等操作速度较快,因此更适合作为字典的键类型。同时,对于高级数据类型如数组、结构体和接口类型,存在值的变化和性能较慢等问题,不建议作为键类型。此外,文章还解答了在值为`nil`的字典上执行读写操作的情况,强调了对可能引发panic的操作需要特别注意。最后,提出了关于字典类型值的并发安全性的思考题,引发读者对并发安全性的思考。通过本文的阅读,读者能够深入了解字典类型的特性和使用限制,以及在实际开发中需要注意的细节和问题。
《Go 语言核心 36 讲》,新⼈⾸单¥59
全部留言(49)
- 最新
- 精选
- 江山如画非原子操作需要加锁, map并发读写需要加锁,map操作不是并发安全的,判断一个操作是否是原子的可以使用 go run race 命令做数据的竞争检测
作者回复: 说得很对
2018-09-013136 - 张民郝大,有个疑问:文中描述“也就是说,字典不会存储任何键值,只会存储它们的哈希值。“ 但是在查找的时候,根据键值的哈希找到后,又去比较键值,防止哈希碰撞。但是键值没有存储怎么比较?
作者回复: 哈希桶里的结构是,“键的哈希值-内部结构”对的集合,这个内部结构的结构是“键1元素1键2元素2键3元素3”,是一块连续的内存。在通过键的哈希值定位找到哈希桶和那个“键的哈希值-内部结构”对之后,就开始在这个内部结构里找有没有这个键。后边的事情你应该都知道了。
2018-08-31450 - Geek_1ed70f不知道是理解能力差,还是基础差,以前只会随便用用,现在读您的文章,读完第一遍似懂非懂,然后用一下午时间翻源码,看解释,弄原理...再回头一读豁然开朗,.....精学了,但是好费时间啊,~~~~~老师如何评价进度与学习成本的取舍呢
作者回复: 你这个时间成本是值得的。真正的学习没有捷径啊。
2019-02-078 - 星云"也就是说,字典不会存储任何键值,只会存储它们的哈希值。" 我也觉得这个说法不严谨,既然,"内部结构"是将键值对捆绑存的,那字典就是存了键,除非"内部结构"不属于字典? 可能没理解到,请郝大指点迷津
作者回复: 好吧,可以说,不会独立存储键的值。
2018-09-047 - NIXUSnil的map,既然不能添加key-element,是否也就意味着这样的map是没有任何意义的?在使用中,应避免用`var m map[string]int` 这种方式来声明map呢?
作者回复: 可以对m直接用索引表达式添加啊。
2018-10-2836 - extraterrestrial!!函数类型为啥不能判等呢,函数头相同就认为相等不行么?
作者回复: 这是Go语言的规定,没必要纠结,你完全用类型断言去判断啊。
2018-09-045 - kuzango里面有没有分段锁的字典实现呢
作者回复: 没有,sync.Map也不是分段锁实现的,如果想看分段锁实现可以看我的《Go并发编程实战》第二版中的例子。
2018-10-094 - 松小鼠结构体作为map的元素时,不能够直接赋值给结构体的某个字段,也就是map中的struct中的字段不能够直接寻址,请问为什么,该怎么处理?
作者回复: 因为 map 内部的元素值的存储地址是会不定期自动变化的(因为会 rehash),所以不可寻址。这也是Go语言规范里说明的。 你不可以直接对 map 中的元素值取址,比如:&map1["a"] ,但是你可以先 var1 := map1["a"] 再 &var1 啊,或者索性把 map1 的元素类型设置成那个结构体的指针类型。 从编码层面是可以这么解决的。而从程序设计层面,你需要想想“你为什么要这么取址?”,以及“是不是哪里设计得不够好?”。
2020-10-133 - colonel哈希桶怎么存储的,是数组吗?碰撞之后的键值又是怎么存储的,形成链表吗?删除机制中,是删除链表中节点吗? 建议,不要大篇幅讨论存储性能,可以对内部数据存储,插入,删除,读取机制更多分享
作者回复: 这些文章里都有写。
2018-09-223 - SuperP ❤ 飝一个哈希表会持有一定数量的桶(bucket),那个新增加一个键值得时候,怎么去划分桶的?
作者回复: 我记得文章里讲了。
2018-09-133