Key 为什么是无序的
Map 在扩容后,会发生 key 的迁移:
- 等量扩容,key 还在和原本同样序号的 bucket 里面。
- 双倍扩容,key 分开存放到两个不同的 bucket,一个是和原本序号相同的 bucket,一个是在原本序号加上2^B的bucket。
所以 map 中 key 的位置不是固定的。
go的特殊做法:
在遍历 map 时,并不是固定地从0号 bucket 开始遍历,每次都是从一个随机值序号的 bucket 遍历,并且从这个 bucket 的一个随机序号的 cell 开始遍历。所以就算是一个写死的 map,仅仅只是遍历它,也不会返回一个固定序列的 k-v 对。