Разберем одну из самых популярных и коварных задач на собеседованиях по Go Concurrency в BigTech — вызов «долгой» функции с дедлайном. Ты узнаешь, как правильно использовать каналы, контекст и селекты, чтобы не допустить утечек горутин и корректно обрабатывать ошибки.
В этом уроке:
В итоге у тебя будет четкий алгоритм решения задачи, которая проверяет сразу несколько ключевых аспектов Go: от семантики каналов и многопоточности до понимания устройства стандартных абстракций языка.
В этом уроке:
- Постановка задачи: как реализовать ограничение времени выполнения (Timeout/Deadline) для функции, которую нельзя отменить напрямую.
- Работа с каналами: превращаем синхронный вызов в асинхронный с помощью паттерна Future и возвращаем канал только для чтения.
- Оператор Select: как правильно организовать ожидание результата и сигнала об окончании времени, используя time.After.
- Нюансы закрытия каналов: разбираем тонкий хак с получением Zero Value при чтении из закрытого канала для возврата результата или ошибки.
- Пишем свой Context: пошаговая реализация упрощенного аналога стандартного пакета context с методами Done(), Err() и функцией отмены.
- Generic-реализация: масштабируем решение задачи для работы с любыми типами данных с помощью дженериков.
В итоге у тебя будет четкий алгоритм решения задачи, которая проверяет сразу несколько ключевых аспектов Go: от семантики каналов и многопоточности до понимания устройства стандартных абстракций языка.