Sobes.tech
Junior — Middle

Prečo pri použití map nie je zaručený poradie prvkov a zdá sa, že je náhodné?

sobes.tech AI

Odpoveď od AI

V Go je vstavaná štruktúra map implementovaná pomocou hash tabuľky a poradie prechodu prvkov nie je garantované a môže sa meniť medzi iteráciami. To je spôsobené tým, že:

  • Hash funkcia rozdeľuje kľúče do vedier, a poradie vedier nie je pevné.
  • Pre bezpečnosť a na zabránenie závislosti od poradia, od Go 1.0, je poradie prechodu mapou špeciálne náhodne zmenené pri každej iterácii.

Preto pri prechádzaní mapou sa poradie prvkov zdá byť náhodné a nemalo by sa používať v logike programu. Ak je potrebný zoradený výstup, je potrebné zvlášť zoradiť kľúče:

m := map[string]int{"b": 2, "a": 1, "c": 3}
keys := make([]string, 0, len(m))
for k := range m {
    keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
    fmt.Println(k, m[k])
}

Týmto spôsobom získate prvky v zoradenom poradí.