Go 地圖中的分配順序
考慮以下Go 代碼:
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}]但是,如果對測試頂點的聲明進行微小更改,請將右花括號向右移動四個空格:
m["test"] = Vertex{ 12.0, 100, }
輸出更改為:
{40.68433 74.39967} map[test:{12 100} Bell Labs:{40.68433 74.39967}]
問題來了:為什麼這個輕微的修改會影響地圖的順序?
答案:
地圖中的順序Go 取決於所使用的底層雜湊函數。此雜湊函數是隨機的,以減輕利用雜湊衝突的拒絕服務攻擊。請參閱以下問題追蹤器以了解更多資訊:
http://code.google.com/p/go/issues/detail?id=2630
請務必注意地圖順序語言規範不保證。雖然目前的 Go 實作保持穩定的順序,但未來的修訂可能會在垃圾收集或其他操作期間壓縮映射,從而可能在不透過程式碼明確修改映射的情況下改變順序。因此,依賴映射的特定順序是不明智的。
如Go 規範所述:
映射是無序一種類型的元素組,稱為元素類型,由另一種類型(稱為鍵類型)的一組唯一鍵進行索引。
以上是為什麼更改 Go Map 分配中的縮排會影響輸出順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!