基础

    map遍历的随机性
    作用:
    https://stackoverflow.com/questions/9619479/go-what-determines-the-iteration-order-for-map-keys
    保证go版本迭代的可移植性,无法保证每个版本迭代后map的遍历顺序都是一致的。

    • 早期go1.0的迭代顺序为插入顺序,如果发生冲突,则会更新插入顺序。即无法保证每一次的迭代顺序,这之后则改用随机方式,来保证整体的可移植性。

    实现:runtime.mapiterinit
    每次遍历时都使用 fastrand() 生成随机数来指定开始迭代的起始位置。

    1. // ...
    2. // decide where to start
    3. r := uintptr(fastrand())
    4. if h.B > 31-bucketCntBits {
    5. r += uintptr(fastrand()) << 31
    6. }
    7. // ...