连续两次被问到 map 遍历输出无序的原因

看过数据结构的我自信的回答:应为底层是散列表,没有顺序表内存上的连续,也没有链表逻辑上的前后继关系。

面试官笑得很诡异,而且就到此为止了。

直到我看到这段代码:

...
// decide where to start
r := uintptr(fastrand())
if h.B > 31-bucketCntBits {
    r += uintptr(fastrand()) << 31
}
it.startBucket = r & bucketMask(h.B)
it.offset = uint8(r >> h.B & (bucketCnt - 1))

// iterator state
it.bucket = it.startBucket

遍历过程中居然有随机种子!

研究的详细请阅读下附链接,我也是从他那里学到的~

参考

为什么遍历 Go map 是无序的?