Какой опыт с языками программирования?
Что проверяют
Для Go-разработчика вопрос сводится к тому, понимаете ли вы модель языка: горутины, каналы, интерфейсы, ошибки как значения. Следом часто просят рассказать, как устроен планировщик или что будет при чтении из закрытого канала.
Как отвечать
Основной язык подробно, остальные коротко.
- версия: на какой версии Go работаете. Поддерживаются две последние версии, а обещание совместимости Go 1 делает обновление почти безболезненным. Ориентиры: дженерики с 1.18,
log/slogс 1.21, своя переменная цикла на каждую итерацию с 1.22,rangeпо функциям-итераторам с 1.23; - конкурентность: горутины и планировщик по модели G-M-P, буферизованные и небуферизованные каналы,
select,sync.WaitGroup,sync.Mutex,errgroup, отмена черезcontext.Context; - ошибки: возвращаются значением, оборачиваются через
fmt.Errorf("...: %w", err), проверяются черезerrors.Isиerrors.As; - интерфейсы: неявная реализация, маленькие интерфейсы на стороне потребителя, ловушка с интерфейсом, внутри которого лежит типизированный nil;
- инструменты:
go test -race,pprof,golangci-lint, модули иgo.mod; - соседние языки: Python для скриптов, SQL, Bash. Если пришли из PHP, Java или Python, скажите, от каких привычек пришлось отказаться.
Историю берите свою: какой сервис, какая нагрузка, что сделали сами. RPS и задержки называйте только из реальных замеров и с перцентилем. Если Go в продакшене у вас пока немного, признайте это и расскажите, что уже написали и на каких особенностях языка обожглись.
Где спотыкаются
Запускают горутины без способа их остановить. Горутина, которая вечно ждёт канал, это утечка, и в pprof она видна по растущему числу горутин.
Не знают, что одновременная запись в map из нескольких горутин без синхронизации роняет программу с фатальной ошибкой, а не просто портит данные.
Пишут на Go как на Java: глубокие иерархии, интерфейс на каждую структуру заранее, panic вместо возврата ошибки.