Будет ли сохраняться порядок ключей при нескольких итерациях по Map

«Будет ли сохраняться порядок ключей при нескольких итерациях по Map» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go порядок ключей в map не гарантирован и может меняться между итерациями. Это связано с тем, что map реализован как хеш-таблица, и порядок зависит от хеш-функции и внутренней структуры данных. Начиная с Go 1.0, разработчики намеренно рандомизируют порядок итерации, чтобы предотвратить зависимость от него в коде.

Пример:

m := map[string]int{"a": 1, "b": 2, "c": 3}

// Первая итерация
for k := range m {
    fmt.Print(k) // Может вывести "a b c"
}

// Вторая итерация
for k := range m {
    fmt.Print(k) // Может вывести "b a c"
}

Если нужен стабильный порядок, следует использовать сортировку ключей:

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