Материал проходит вычитку — возможны неточности.
Урок 36 из 118

Порядок итерации

Клиент заметил: один и тот же список файлов каждый раз выходил в разном порядке. Миша сперва не поверил, потом воспроизвёл на стенде. В выдаче он завёл сортировку по имени.

Главная мысль

порядок итерации по карте не гарантирован, а реализация дополнительно рандомизирует старт, чтобы на порядок не полагались; стандартный способ получить детерминированный порядок — сортировка ключей.

Порядок не гарантирован

Go

Порядок вывода не определён спецификацией и может меняться между запусками. Реализация дополнительно рандомизирует старт итерации — намеренно, чтобы разработчики не начинали полагаться на порядок. Следствие: полагаться на порядок — баг, даже если на твоей машине он «стабилен».

Детерминированный порядок — сортировка

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
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Почему порядок итерации по карте меняется между запусками?

Вопрос 2 из 3

Что гарантировано при изменении карты во время range?

Вопрос 3 из 3

Как получить детерминированный порядок вывода карты?

Итоги

Итерация по карте неупорядочена; стандартный способ получить детерминированный порядок — сортировка ключей. На порядок карты не полагаются никогда.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки