1 回答
TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
為什么它們是無序的?
因?yàn)檫@為運(yùn)行時(shí)實(shí)現(xiàn)地圖類型提供了更大的自由。雖然我們知道 Go 的(當(dāng)前)實(shí)現(xiàn)是哈希圖,但語言規(guī)范允許使用任何映射實(shí)現(xiàn),例如哈希圖、樹圖等。而且不必記住順序,這允許運(yùn)行時(shí)更有效地完成其工作并使用更少的資源記憶。
阿德里安的評(píng)論很好地總結(jié)了秩序是很少需要的,總是維持秩序?qū)⑹且环N浪費(fèi)。當(dāng)您確實(shí)需要順序時(shí),可以使用提供順序的數(shù)據(jù)結(jié)構(gòu)。
由于密鑰的哈希值位于存儲(chǔ)桶內(nèi)的有序數(shù)組中,為什么每次我循環(huán)遍歷地圖時(shí)它的順序都不同?
Go 作者有意將 Map 的迭代順序隨機(jī)化(這樣我們凡人就不會(huì)依賴于固定的順序)。
實(shí)際值存儲(chǔ)在內(nèi)存中的什么位置?
“哪里”由 指定hmap.buckets。這是一個(gè)指針值,它指向內(nèi)存中的一個(gè)數(shù)組,一個(gè)保存桶的數(shù)組。
buckets????unsafe.Pointer?//?array?of?2^B?Buckets.?may?be?nil?if?count==0.
Sohmap.buckets指向保存存儲(chǔ)桶的連續(xù)內(nèi)存段。存儲(chǔ)桶是由 來“建?!钡?code>bmap,但這不是它實(shí)際的內(nèi)存布局。存儲(chǔ)桶以一個(gè)數(shù)組開始,該數(shù)組保存存儲(chǔ)桶 (?tophash [bucketCnt]uint8) 中鍵的頂部哈希字節(jié),該數(shù)組后面是bucketCnt存儲(chǔ)桶的鍵,然后是bucketCnt存儲(chǔ)桶的值。最后還有一個(gè)溢出指針。
將存儲(chǔ)桶想象成這樣的概念類型,它“可視化”鍵和值在內(nèi)存中的位置:
type conceptualBucket struct {
? ? tophash? ? ?[bucketCnt]uint8
? ? keys? ? ? ? [bucketCnt]keyType
? ? values? ? ? [bucketCnt]valueType
? ? overflowPtr uintptr
}
注意:bucketCnt是一個(gè)編譯時(shí)間常數(shù)8,它是一個(gè)桶可以容納的鍵/元素對(duì)的最大數(shù)量。
當(dāng)然,這個(gè)“圖片”是不準(zhǔn)確的,但它給出了鍵和值存儲(chǔ)在哪里/如何存儲(chǔ)的想法。
- 1 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)
