Ответ
Порядок итерации по 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])
}
}