С какими паттернами проектирования приходилось работать в Go?
Что проверяют
Не знание каталога паттернов, а понимаете ли вы, какие из них в Go растворяются в самом языке. Ответ строго по книге сразу показывает человека, который пишет на Go как на Java, и для собеседующего это важнее списка названий.
Как отвечать
Начните с того, что часть классики в Go схлопывается: стратегия это тип-функция, декоратор это обёртка над интерфейсом, наследование заменяется встраиванием, фабрика чаще всего просто конструктор NewX. Дальше про то, что применяете:
- функциональные опции: конструктор принимает
...Option, это штатный способ собрать структуру с необязательными параметрами вместо десятка конструкторов; - узкие интерфейсы, объявленные на стороне потребителя, отсюда правило «принимай интерфейсы, возвращай структуры»;
- промежуточные слои поверх
http.Handler: цепочка обёрток для журналирования, авторизации и восстановления после паники; - конкурентные схемы: пул воркеров, конвейер на каналах, разветвление и сборка,
errgroupдля группы с общей отменой,singleflightпротив одинаковых параллельных запросов; - граница с внешним миром: репозиторий или адаптер, чтобы доменный код не знал про драйвер базы;
- отмена через
context.Contextпервым аргументом, обёртка ошибок и разбор черезerrors.Isиerrors.As.
Из классики честно назовите одиночку на sync.Once и наблюдателя, но сразу с оговоркой про их цену.
Где спотыкаются
Тащат привычки из Java: интерфейс на каждую реализацию, имена вида IUserService, фабрики фабрик. В Go интерфейс объявляет тот, кто его использует, и пакету с единственной реализацией интерфейс обычно не нужен вовсе.
Второе: одиночка как глобальное изменяемое состояние. Пакетную переменную не подменить в тесте, зависимости становятся невидимыми, а обычный конструктор с явной передачей решает ту же задачу без магии.
Третье: наблюдатель и шины событий без блокировки и без отмены. Список подписчиков, в который пишут и читают из разных горутин, это гонка, а отправка в канал, который никто не читает, это утечка горутины на всё время жизни процесса.