go map 无序原因
连续两次被问到 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
遍历过程中居然有随机种子!
研究的详细请阅读下附链接,我也是从他那里学到的~
参考
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/go/go-map-%E6%97%A0%E5%BA%8F%E5%8E%9F%E5%9B%A0/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。