Sobes.tech
Junior — Middle

Zašto redosled elemenata nije garantovan pri korišćenju map i deluje nasumično?

sobes.tech АИ

Одговор од АИ

U Go-u, ugrađena struktura map je implementirana korišćenjem hash tabele, i redosled prolaska kroz elemente nije garantovan i može se menjati između iteracija. To je zbog:

  • Funkcija heširanja raspoređuje ključeve po kantama, i redosled kanti nije fiksan.
  • Zbog sigurnosti i sprečavanja zavisnosti od reda, od Go 1.0, redosled prolaska kroz mapu je posebno nasumično promenjen pri svakoj iteraciji.

Zbog toga, prilikom prolaska kroz mapu, redosled elemenata deluje nasumično i ne bi trebalo da se koristi u logici programa. Ako je potrebna sortirana izlaz, ključevi se posebno sortiraju:

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

Na ovaj način, dobićete elemente u sortiranoj listi.