В каком стиле пишешь на Go и какого концептуального стиля придерживаешься
Что проверяют
Вопрос открытый, и по ответу видно, писали ли вы на Go как на Go или тащили привычки из Java и Python. Ждут не список правил, а ваши осознанные предпочтения.
Как отвечать
Оттолкнитесь от того, что в Go стиль во многом задан инструментами и сообществом, а дальше расскажите про свои принципы:
- явные ошибки: ошибка это значение, возвращается последней и обрабатывается сразу. Оборачивание через
fmt.Errorf("...: %w", err), проверка черезerrors.Isиerrors.As. Паника только на действительно невозможные ситуации, в библиотечном коде её быть не должно; - простота вместо абстракций впрок: интерфейс заводится, когда появился второй потребитель, а не заранее. Небольшой дублирующий код честнее преждевременного обобщения;
- интерфейсы объявляются у потребителя, а не рядом с реализацией, и остаются маленькими. Пакет отдаёт конкретный тип, принимает интерфейс;
- контекст первым параметром во всём, что ходит по сети или может быть отменено, и он же несёт таймауты;
- конкурентность по необходимости: горутина обязана иметь понятного владельца и способ завершиться. Каналы для передачи данных, мьютекс для защиты состояния,
errgroupдля группы задач; - структура проекта: пакеты по смыслу, а не по слоям, без папки
utils, зависимости внутрь домена; - инструменты:
gofmtиgoimportsбез обсуждений, линтер вродеgolangci-lint, тесты таблицей,-raceв CI.
Хорошо, если сошлётесь на общие ориентиры: комментарии из Effective Go, обзорные заметки Code Review Comments, и приведёте пример решения из своего кода.
Где спотыкаются
Отвечают «пишу по гайдлайнам» без единого примера.
Строят слои интерфейсов вокруг каждой зависимости, как в Java, и получают код, который трудно читать.
Прячут ошибки: _ = err, логирование вместо возврата или наоборот двойная обработка на каждом уровне.