Порядок итерации
Клиент заметил: один и тот же список файлов каждый раз выходил в разном порядке. Миша сперва не поверил, потом воспроизвёл на стенде. В выдаче он завёл сортировку по имени.
порядок итерации по карте не гарантирован, а реализация дополнительно рандомизирует старт, чтобы на порядок не полагались; стандартный способ получить детерминированный порядок — сортировка ключей.
Порядок не гарантирован
Что здесь показано
- Стек — локальные переменные функции.
i = 3— значение;p = ptr → 10— указатель на значение;b = "hello"— срез (заголовок: указатель + длина + ёмкость). - Куча — данные, на которые ссылаются переменные:
rodata— байты строки-литерала (в бинарнике),данные N Б— бэкинг-массив слайса,строка— динамическая строка. - Горутины — лёгкие потоки Go: статус (running/runnable/waiting…), функция, в которой каждая сейчас находится, размер стека (растёт по мере работы) и пометка «из main» — горутина запущена из твоего кода.
- GC — сборщик мусора: фаза (off/mark) и число завершённых циклов.
Порядок вывода не определён спецификацией и может меняться между запусками. Реализация дополнительно рандомизирует старт итерации — намеренно, чтобы разработчики не начинали полагаться на порядок. Следствие: полагаться на порядок — баг, даже если на твоей машине он «стабилен».
Детерминированный порядок — сортировка
keys := make([]string, 0, len(filesByID))
for k := range filesByID {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, filesByID[k])
}
Сначала собираешь ключи в слайс, сортируешь, потом идёшь по отсортированным ключам. Это стандартный паттерн для любого вывода, где порядок важен: логи, JSON, отчёты.
Вы узнаете:
- почему порядок случайный, а не просто «неуказанный»
- как вести себя при добавлении или удалении во время
range
Проверьте себя
Почему порядок итерации по карте меняется между запусками?
Что гарантировано при изменении карты во время range?
Как получить детерминированный порядок вывода карты?
правильных ответов
Итерация по карте неупорядочена; стандартный способ получить детерминированный порядок — сортировка ключей. На порядок карты не полагаются никогда.
10 000 ₽ · 60 минут · онлайн