知识卡片
键必须可比较
内容
map 的 key 必须支持相等比较,因为哈希命中后还要确认具体键是否相同。切片、函数等不可比较类型不能做 key;这不是语法限制,而是哈希表正确性的前提。
参考来源
- 位置:《Go语言底层原理剖析》第8章《哈希表与Go语言实现机制》8.2.4节《key的比较性》与8.5.3节《map访问原理》
- 结论依据:原文说明"如果没有办法比较map中的key是否相同,那么这些key就不能作为map的key",并列出切片、函数、map 本身"不可比较";随后在访问原理中说明查找时先比较 tophash 前8位,"如果hash值相同,则会找到此hash值对应的key值并判断是否相同",因此可以推出"key 必须可比较,是因为哈希命中后还要用 == 语义确认具体键相同"的结论。
- 原始内容:很容易理解,如果没有办法比较map中的key是否相同,那么这些key就不能作为map的key……◎切片、函数、map是不可比较的。……此hash挨个与存储在桶中的tophash进行对比。如果有hash值相同,则会找到此hash值对应的key值并判断是否相同。如果key值也相同,则说明查找到了结果,返回value。