Golang List, Ring and Map
极客时间《Go 语言核心 36 讲》学习笔记 06,图片来自网络
08 | container 包中的那些容器
这一课没有示例代码,确实不太习惯,去看了一下 list.go 的源码,才平复了一下心情。
List 实现了一个双向链表,Ring 实现一个循环链表。
对于思考题,container/ring 包中的循环链表可能的适用场景可能有类似于滑动窗口协议的缓存实现,可以实现 FIFO 的队列;
container/heap 没有用过,看了一下 heap.go 的源码,以及附带的 example_intheap_test.go 和 example_pq_test.go,感觉设计还是很巧妙的,可以用于堆排序和优先队列。
09 | 字典的操作和约束
“键-元素对”确实比“键值对”更符合 Golang 的语义。
Go 语言的字典类型是用哈希表实现的,那么 Java 等其他语言应该也是采用类似的哈希映射的方式实现的吧,需要再深入了解一下。
Go 语言字典的键类型不能是函数、字典和切片,主要就是因为没有办法做哈希映射,或者说没有办法比较(判等?)。
对于思考题,我认为,字典类型的值应该不是并发安全的,如果有两个进程同时修改同一个字典的键-元素对。如果只在字典上添加或或删除键-元素对的情况下,依旧不安全,因为可能会添加重复的键-元素对,或者删除不存在的键-元素对。
看了一下参考答案,没有想到“字典值内部有时候会根据需要进行存储方面的调整。”这一条。
如果有机会的话,确实应该去看一下 map.go 的源码。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/87b9e516ad039b3b578b4876f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论