Sobes.tech
Junior — Middle

Kod naudodami map, elementų tvarka nėra garantuota ir atrodo atsitiktinė?

sobes.tech AI

Atsakymas iš AI

Go viduje įmontuota struktūra map yra įgyvendinta naudojant maišos lentelę, ir elementų perėjimo tvarka nėra garantuota ir gali keistis tarp iteracijų. Tai yra dėl:

  • Maišos funkcija paskirsto raktus į kibirus, ir kibirų tvarka nėra fiksuota.
  • Saugumo ir priklausomybės nuo tvarkos išvengimo tikslais, nuo Go 1.0, map perėjimo tvarka yra specialiai atsitiktinai pakeičiama kiekvienos iteracijos metu.

Todėl, perėjus per map, elementų tvarka atrodo atsitiktinė ir neturėtų būti naudojama programos logikoje. Jei reikalingas surūšiuotas išvedimas, reikėtų atskirai surūšiuoti raktus:

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

Taip gausite elementus surūšiuotu tvarka.