Sobes.tech
Junior — Middle

Dlaczego podczas korzystania z mapy kolejność elementów nie jest gwarantowana i wydaje się losowa?

sobes.tech AI

Odpowiedź od AI

W Go wbudowana struktura map jest zaimplementowana przy użyciu tablicy haszującej, a kolejność iteracji elementów nie jest gwarantowana i może się zmieniać między iteracjami. Wynika to z:

  • Funkcja haszująca rozkłada klucze na kubełki, a kolejność kubełków nie jest stała.
  • Dla bezpieczeństwa i zapobiegania zależności od kolejności, od Go 1.0, kolejność iteracji mapy jest specjalnie losowo zmieniana przy każdej iteracji.

Dlatego podczas iteracji po mapie, kolejność elementów wydaje się losowa i nie powinna być używana w logice programu. Jeśli potrzebny jest uporządkowany wynik, należy osobno posortować klucze:

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])
}

W ten sposób otrzymasz elementy w posortowanej kolejności.