基础
map遍历的随机性
作用:
https://stackoverflow.com/questions/9619479/go-what-determines-the-iteration-order-for-map-keys
保证go版本迭代的可移植性,无法保证每个版本迭代后map的遍历顺序都是一致的。
- 早期go1.0的迭代顺序为插入顺序,如果发生冲突,则会更新插入顺序。即无法保证每一次的迭代顺序,这之后则改用随机方式,来保证整体的可移植性。
实现:runtime.mapiterinit
每次遍历时都使用 fastrand() 生成随机数来指定开始迭代的起始位置。
// ...// decide where to startr := uintptr(fastrand())if h.B > 31-bucketCntBits {r += uintptr(fastrand()) << 31}// ...
