1 回答

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