Sobes.tech
Junior — Middle

Proč není při použití map zaručen pořadí prvků a zdá se být náhodné?

sobes.tech AI

Odpověď od AI

V Go je vestavěná struktura map implementována pomocí hash tabulky a pořadí průchodu prvky není garantováno a může se měnit mezi iteracemi. To je způsobeno tím, že:

  • Hash funkce rozděluje klíče do košů a pořadí košů není pevné.
  • Pro bezpečnost a zabránění závislosti na pořadí je od Go 1.0 specificky náhodně měněn pořadí průchodu mapou při každé iteraci.

Proto při průchodu mapou se pořadí prvků zdá být náhodné a nemělo by být používáno v logice programu. Pokud je potřeba seřazený výstup, je třeba klíče zvlášť seřadit:

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 způsobem získáte prvky ve seřazeném pořadí.