Sobes.tech
Junior — Middle

Miért nem garantált az elemek sorrendje a map használatakor, és miért tűnik véletlenszerűnek?

sobes.tech MI

Válasz az MI-től

Go-ban a beépített map szerkezet hash-tábla segítségével van megvalósítva, és az elemek bejárási sorrendje nem garantált, és iterációk között változhat. Ennek oka:

  • A hash-függvény elosztja a kulcsokat a vödörökbe, és a vödrök sorrendje nem fix.
  • A biztonság és a sorrendtől való függőség elkerülése érdekében, a Go 1.0-tól kezdve, a map bejárási sorrendje kifejezetten véletlenszerűvé válik minden iteráció során.

Ezért, amikor map-et járunk be, az elemek sorrendje véletlenszerűnek tűnik, és nem szabad a program logikájában használni. Ha rendezett kimenetre van szükség, külön kell rendezni a kulcsokat:

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

Így a rendezett sorrendben kapod meg az elemeket.