Go становится всё более популярным для backend-разработки: быстрый, простой, отличная конкурентность. Вот что спрашивают на собеседовании Golang Junior.
Базовый Go (вопросы 1–15)
1. Чем Go отличается от других языков?
Статически типизированный, компилируемый. Нет классов и наследования — только структуры и интерфейсы. Встроенная поддержка конкурентности (горутины, каналы). Быстрая компиляция. Сборщик мусора.
2. Что такое `goroutine`?
Лёгкий поток выполнения, управляемый рантаймом Go. Запускается через `go func()`. Тысячи горутин потребляют меньше памяти, чем потоки ОС (начальный стек ~2KB, растёт при необходимости).
3. Что такое `channel`?
Типизированный канал для передачи данных между горутинами. `ch := make(chan int)`. Буферизованный: `make(chan int, 10)`. Отправка: `ch <- 42`. Приём: `val := <-ch`.
4. Что такое `select`?
Аналог switch для каналов. Выбирает первый готовый case. `default` — неблокирующий выбор.
5. Что такое `defer`?
Откладывает выполнение функции до возврата из текущей. Выполняется в LIFO порядке. Используется для `Close()`, разблокировки мьютексов.
6. Что такое `panic` и `recover`?
`panic` — аварийное завершение, разматывает стек. `recover` — перехватывает panic внутри `defer`. Не используйте panic для обычной обработки ошибок.
7. Как обрабатываются ошибки в Go?
Явным возвратом: `func f() (int, error)`. Проверка: `if err != nil { return ... }`. Нет исключений. Это идиома Go — явная обработка каждой ошибки.
8. Что такое `interface{}` / `any`?
Пустой интерфейс — принимает значение любого типа. `any` — псевдоним с Go 1.18. Используется когда тип неизвестен заранее. Для проверки типа — type assertion: `val.(string)`.
9. Что такое множественные возвращаемые значения?
`func divide(a, b int) (int, error)` — функция возвращает несколько значений. Типично для пар (результат, ошибка).
10. Что такое `make` vs `new`?
`make` — инициализирует slice, map, channel (возвращает инициализированный объект). `new` — выделяет память и возвращает указатель на нулевое значение.
11. Что такое срез (slice)?
Динамический массив. Структура: указатель на массив, длина, ёмкость. `append(slice, elem)` — добавить элемент (может создать новый underlying array).
12. Что такое `map` в Go?
Хеш-таблица: `m := make(map[string]int)`. Проверка существования ключа: `val, ok := m["key"]`. Не потокобезопасен — для конкурентного доступа используйте `sync.Map` или мьютекс.
13. Что такое `struct`?
Пользовательский тип с полями. Нет наследования — только встраивание (composition): `type Dog struct { Animal; Name string }`.
14. Что такое указатели в Go?
`T` — тип указателя. `&var` — адрес. `ptr` — разыменование. Нет арифметики указателей (в отличие от C). Используются для изменения значения внутри функции.
15. Что такое `init()` функция?
Выполняется автоматически при инициализации пакета, до `main()`. В пакете может быть несколько `init()`. Используется для регистрации, инициализации конфигурации.
Конкурентность и интерфейсы (вопросы 16–25)
16. Что такое `sync.Mutex`?
Мьютекс для синхронизации доступа к общим данным. `mu.Lock()` / `mu.Unlock()`. Типичный паттерн с `defer mu.Unlock()`.
17. Что такое `WaitGroup`?
`sync.WaitGroup` — ожидание завершения группы горутин. `wg.Add(1)` — добавить, `wg.Done()` — отметить завершение, `wg.Wait()` — ждать всех.
18. Что такое `context`?
Контекст выполнения: передаётся в функции для управления отменой (`context.WithCancel`) и таймаутами (`context.WithTimeout`). Первый аргумент в большинстве API-функций.
19. Что такое `atomic` операции?
`sync/atomic` — атомарные операции над числами без мьютекса. `atomic.AddInt64(&counter, 1)`. Быстрее мьютекса для простых счётчиков.
20. Что такое `race condition`?
Ситуация, когда результат зависит от порядка выполнения горутин. Обнаружение: `go run -race main.go`. Предотвращение: мьютексы, каналы, atomic.
21. Что такое интерфейс в Go?
Набор методов. Реализуется неявно — если тип имеет все методы интерфейса, он его реализует. Нет `implements`. `io.Reader`, `io.Writer` — примеры из стандартной библиотеки.
22. Что такое duck typing в Go?
Неявная реализация интерфейсов: «если оно ходит как утка и крякает как утка — это утка». Go проверяет набор методов, а не явное объявление.
23. Что такое `error` интерфейс?
`type error interface { Error() string }`. Любой тип с методом `Error() string` реализует `error`. `errors.New("msg")` и `fmt.Errorf("msg: %w", err)` создают ошибки.
24. Что такое `type assertion` и `type switch`?
Type assertion: `val, ok := i.(string)`. Type switch: `switch v := i.(type) { case string: ... case int: ... }` — безопасное определение типа.
25. Что такое embedding?
Встраивание типа в структуру: `type Logger struct { sync.Mutex }`. Logger автоматически получает методы Mutex. Аналог наследования через composition.
Инструменты и практика (вопросы 26–30)
26. Что такое `go modules`?
Система управления зависимостями. `go.mod` — декларация модуля и зависимостей. `go get`, `go mod tidy` — управление зависимостями.
27. Что такое `goroutine leak`?
Горутина запущена, но никогда не завершится: заблокирована на канале, которого никто не закроет. Утечка ресурсов. Предотвращение: context с cancel.
28. Что такое `go test`?
Встроенный инструмент тестирования. Файлы `_test.go`, функции `TestXxx(t testing.T)`. `t.Errorf`, `t.Fatalf` — репортинг ошибок. `-race` — проверка гонок.
29. Что такое `table-driven tests`?
Идиома тестирования в Go: тесты описываются как срез структур с входными данными и ожидаемым результатом. Позволяет легко добавлять тест-кейсы.
30. Что такое `GOPATH` и `GOROOT`?
`GOROOT` — директория установки Go. `GOPATH` — рабочая директория для проектов (устарело в пользу modules). `go env` — посмотреть все переменные окружения Go.
FAQ
Почему Go набирает популярность?
Простой синтаксис, быстрая компиляция, отличная конкурентность. Популярен для микросервисов, DevOps-инструментов, облачной инфраструктуры.
Много ли вакансий Go Junior?
Меньше, чем Python или Java, но конкуренция ниже. Хорошая ниша.
Нужен ли Go для Kubernetes?
Kubernetes написан на Go. Знание Go помогает разбираться в инструментах экосистемы.