Открытые уроки

Итераторы в Go

В этом уроке:
  • 00:00 — Введение
  • 01:16 — Особенности и нюансы итераторов в Go
  • 03:21 — Поведенческий паттерн итератор
  • 07:56 — Итераторы в Go
  • 15:48 — Пакет iter в Go
  • 21:12 — Итераторы в пакетах slices и maps
  • 22:21 — Бенчмарки с итераторами
  • 23:53 — Связный список с итераторами
  • 26:00 — Naming conventions для итераторов
  • 27:16 — Бинарные деревья с итераторами
  • 29:37 — Сканер с итератором
  • 31:33 — Пагинация на итераторах
  • 34:50 — Функциональное программирование с итераторами
  • 39:37 — Пайплайны на итераторах
  • 44:22 — Трансформации с итераторами
  • 45:48 — Итераторы для вычисления чисел фибоначчи
  • 47:19 — Push и pull итераторы
  • 51:31 — Обработка ошибок во время итерации
  • 54:55 — Паники во время итерации
  • 01:02:23 — Внутреннее устройство push итераторов
  • 01:04:51 — Внутреннее устройство pull итераторов

Автор видео начинает с разграничения классического поведенческого паттерна Iterator и подхода, который используется в Golang. Если в ООП-мирах итератор — это объект с методами вроде HasNext/Next, то в Go упор делается на простые протоколы обхода и функции как источники значений, что сокращает накладные расходы и упрощает чтение кода.

Затем обсуждаются итераторы, характерные именно для Golang: "pull"-итераторы (потребитель запрашивает следующий элемент, чаще всего как Next () (T, bool)) и "push"-итераторы (производитель «толкает» значения в переданную колбэк-функцию). Поясняется, как выбрать модель под задачу: «pull» удобен для пошагового чтения и досрочного завершения, «push» — для конвейеров и трансформаций. Автор отдельно разбирает обработку ошибок и паник во время обхода: где уместен второй возвращаемый результат error, когда логичнее прерывать итерацию, и как безопасно использовать defer/recover.

Отдельный блок — новшества экосистемы вокруг Go: рассматривается пакет iter и то, как он формализует общие шаблоны итерации; показывается, что для стандартных коллекций (slices, maps) появляются удобные вспомогательные итераторы. Акцент — на читаемости и предсказуемости сигнатур, единых naming-conventions и совместимости с уже привычным for … range.

Практическая часть урока насыщенная, потому что автор:
  • проводит бенчмарки, сравнивая циклы, каналы и разные виды итераторов;
  • демонстрирует, как построить итераторы для связанных списков и бинарных деревьев, как сделать итератор-сканер и организовать пагинацию постраничной выборки из внешнего источника.

Урок будет особенно полезен, если ты:
  • junior-разработчик, уже уверенно пишешь for … range, но хочешь понять, когда нужны «функции-итераторы», чем они отличаются от каналов и как не наделать лишних аллокаций.
  • middle-разработчик, который упирается в производительность: где каналы избыточны, как проектировать Next () (T, bool)/func (yield func (T) bool)-подходы, как замерять и выбирать вариант по бенчмаркам.
  • разработчик, пришедший из ООП-языков (Java/C#): тебе будет полезно переосмыслить классический паттерн Iterator на «гошный» лад и понять идиоматичные сигнатуры вместо HasNext/Next.
  • backeng-инженер и автор сервисов с потоковой обработкой, кому нужны конвейеры (pipelines), ленивые преобразования, ограничение памяти и аккуратная остановка по условию/ошибке.

Для просмотра урока необходимо минимальное знание базовых коллекций Golang, ошибок (error), defer/recover, умение читать простые бенчмарки.
Go-собеседования Глубокий Go