首頁 > 後端開發 > Golang > 為什麼 Go 的 Map 輸出看起來是有序的,儘管 Map 是無序的?

為什麼 Go 的 Map 輸出看起來是有序的,儘管 Map 是無序的?

Mary-Kate Olsen
發布: 2024-12-01 13:43:11
原創
110 人瀏覽過

Why Does Go's Map Output Seem Ordered Despite Maps Being Unordered?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板