В каком порядке происходит итерация по map в Go?

Ответ

Порядок итерации по map в Go не гарантирован и является случайным. При каждом новом запуске программы или даже при повторной итерации в рамках одного запуска порядок может меняться.

Это сделано намеренно, чтобы разработчики не полагались на определённый порядок перебора элементов, так как внутренняя структура map может меняться для оптимизации.

Пример случайного порядка:

m := map[string]int{
    "alpha": 1,
    "beta":  2,
    "gamma": 3,
}

// Результат этого цикла будет разным при разных запусках
for k, v := range m {
    fmt.Println(k, v)
}

Как итерироваться в отсортированном порядке?

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

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]int{
        "alpha": 1,
        "beta":  2,
        "gamma": 3,
    }

    // 1. Создаем срез для ключей
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }

    // 2. Сортируем ключи
    sort.Strings(keys)

    // 3. Итерируемся по отсортированным ключам
    for _, k := range keys {
        fmt.Println(k, m[k])
    }
}