Map 中的賦值順序
在 Go 中,map 是鍵值對的無序集合。但是,以下程式碼片段的輸出似乎建議鍵值對的順序:
package main import "fmt" type Vertex struct { Lat, Long float64 } var m map[string]Vertex func main() { m = make(map[string]Vertex) m["Bell Labs"] = Vertex{ 40.68433, 74.39967, } m["test"] = Vertex{ 12.0, 100, } fmt.Println(m["Bell Labs"]) fmt.Println(m) }
執行上述程式碼片段時,它輸出:
{40.68433 74.39967} map[Bell Labs:{40.68433 74.39967} test:{12 100}]
但是,如果修改「test」鍵分配中右大括號周圍的空格,則輸出會改變:
m["test"] = Vertex{ 12.0, 100, }
使用此修改後,輸出變成:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
解釋
觀察到的行為是由於Go 的映射雜湊函數的隨機化所造成的。實現這種隨機化是為了防止利用哈希衝突的拒絕服務攻擊。如 Go 問題追蹤器所述:
http://code.google.com/p/go/issues/detail?id=2630
Go 中不保證地圖順序。儘管當前的實作沒有明確地重新排序映射,但未來的實作可能會在 GC 或其他操作期間壓縮映射,這可能會影響順序。因此,在程式碼中依賴地圖順序是不明智的。
以上是為什麼 Go 的 Map 輸出看起來是有序的,儘管 Map 是無序的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!