Вопросы по Go
Слайсы и мапы изнутри, интерфейсы, ошибки, горутины, каналы, sync и context: то, что гоняют на каждом Go-собесе от junior до senior. После трека вы уверенно предсказываете вывод хитрого кода, пишете конкурентный код без гонок и объясняете, как работают планировщик и GC.
Проверьте себя: тест по Go
20 вопросов, 10 минут, уровень junior, middle или senior
Типы и нулевые значения
Базовые типы, нулевые значения, константы и iota, преобразования, переполнение, сравнимость.
Урок: Типы и нулевые значения в Go 6 мин- Перевод числа между системами счисления на Go
- Права доступа битовой маской на Go
- Наименьший целый тип для суммы на Go
- Что выведет Go: преобразования чисел
- Что выведет Go: iota с выражением
- Что выведет Go: затенение переменной в if
- type A = B и type A B
- byte и rune
Ещё 15 вопросов и задач
- Какой тип не может быть ключом мапы
- Преобразования типов в Go
- Размеры KB и MB через iota
- Целочисленное деление отрицательных чисел
- Размер int в Go
- Переполнение int8 в рантайме
- iota и пропуск строки в const
- Нулевые значения типов
- nil-слайс и пустой слайс
- Затенение переменной через :=
- string(65) в Go
- Нетипизированные константы произвольной точности
- Запись в nil-мапу в Go
- Идиома полезного нулевого значения
- Нулевые значения типов Go
Слайсы и мапы изнутри
Заголовок слайса, общий массив, append и рост ёмкости, устройство map, порядок обхода, nil-мапа.
Урок: Слайсы и мапы изнутри 8 мин- Разбить слайс на части по k на Go
- Удаление дубликатов с сохранением порядка на Go
- Группировка анаграмм на Go
- Циклический сдвиг слайса на Go
- Число подмассивов с суммой k на Go
- Топ-k частых слов на Go
- Что выведет Go: append при полной ёмкости
- Что выведет Go: два append в один подслайс
Ещё 27 вопросов и задач
- Что выведет Go: массив передаётся по значению
- Что выведет Go: изменение элемента и append в функции
- Что выведет Go: удаление ключей во время range
- Что выведет Go: чтение отсутствующего ключа map
- Что выведет Go: слайсы в мапе и общий массив
- Что выведет Go: nil-слайс и пустой слайс
- Что выведет Go: range по массиву и по слайсу
- Что выведет Go: append в слайс во время range
- Что выведет Go: len и cap подслайса
- Что выведет Go: полный срез и append
- Как работает append в Go
- Сколько копирует copy
- Обход мапы в порядке ключей
- append внутри функции и слайс снаружи
- Из чего состоит слайс в Go
- Конкурентная запись в map
- Как устроена map в Go
- Порядок обхода map в Go
- Почему нельзя m[k].Field = v
- Чтение из nil-мапы
- Эвакуация бакетов при росте map
- Шаги append при нехватке ёмкости
- Изменение элемента в range по слайсу структур
- append в подслайс затирает исходный
- Утечка памяти через подслайс
- Устройство map в Go 1.24+
- Полное выражение среза a[low:high:max]
Строки, байты и руны
Строка как неизменяемые байты, UTF-8, range по строке, руны, strings.Builder и конкатенация.
Урок: Строки, байты и руны в Go 6 мин- Байты и символы в строке Go
- Разворот строки с кириллицей на Go
- Сжатие RLE для строк UTF-8 на Go
- Палиндром с кириллицей и знаками на Go
- Перенос текста по ширине в символах на Go
- Что выведет Go: len и range по строке с кириллицей
- Что выведет Go: руны, байты и преобразования
- Что выведет Go: сравнение и срезы строк
Ещё 15 вопросов и задач
- strings.Builder
- Копирует ли []byte(s)
- Склейка строк в цикле
- Можно ли изменить строку в Go
- Индексация строки в Go
- range по невалидному UTF-8
- len строки с кириллицей
- Функции для работы со строками
- Индексы в range по строке
- Разворот строки с кириллицей
- Число символов в строке
- strings.Split пустой строки
- Внутреннее устройство строки
- Производительность работы со строками
- Строки и UTF-8 в Go
Структуры, методы и интерфейсы
Ресиверы по значению и указателю, наборы методов, неявная реализация, nil-интерфейс, встраивание.
Урок: Структуры, методы и интерфейсы 8 мин- LRU-кеш на Go: map и двусвязный список
- Очередь с приоритетом через container/heap на Go
- Площади фигур через интерфейс Shape на Go
- Сортировка структур по нескольким ключам на Go
- Что выведет Go: встраивание и вызов метода
- Что выведет Go: интерфейс хранит копию значения
- Что выведет Go: method value и defer копируют ресивер
- Что выведет Go: nil-указатель в интерфейсе error
Ещё 19 вопросов и задач
- Что выведет Go: ресиверы по значению и указателю
- Что выведет Go: сравнение структур и указателей
- Что выведет Go: type switch
- Что выведет Go: сравнение интерфейсов со слайсами внутри
- Проверка реализации интерфейса при компиляции
- Где объявлять интерфейс в Go
- Встраивание: чей метод вызовется
- Встраивание и наследование
- Пустая структура struct{}
- Сравнение интерфейсов с несравнимым типом
- Проектирование интерфейсов в Go
- Что такое itab
- Внутренности интерфейсов
- Набор методов и реализация интерфейса
- Интерфейс с nil-указателем не равен nil
- Ресивер по значению или указателю
- Приведение типа интерфейса без ok
- type switch
- Метод с ресивером по значению меняет копию
Ошибки, defer, panic и recover
error как значение, обёртка %w, errors.Is и As, sentinel-ошибки, defer и именованные возвраты, panic и recover.
Урок: Ошибки, defer, panic и recover 8 мин- Когда вычисляются аргументы defer
- Ошибка Close при записи файла
- Порядок выполнения defer
- Обработка ошибок в Go-сервисе
- Когда errors.As, а когда errors.Is
- errors.Is и обёрнутая ошибка
- errors.Join
- defer меняет именованный результат
Ещё 17 вопросов и задач
- Что происходит при return с defer
- Когда уместен panic
- Как работают panic, defer и recover
- Где recover работает, а где нет
- recover и паника в другой горутине
- Sentinel-ошибка
- Чем %v отличается от %w в fmt.Errorf
- Банковские счета и sentinel-ошибки на Go
- Валидация конфигурации со сбором всех ошибок на Go
- Калькулятор обратной польской записи с ошибками на Go
- Калькулятор int64 с ошибками вместо паник на Go
- Что выведет Go: порядок defer и вычисление аргументов
- Что выведет Go: errors.Is и errors.As по цепочке
- Что выведет Go: defer и именованные результаты
- Что выведет Go: defer при панике и повторная паника
- Что выведет Go: recover превращает панику в ошибку
- Код-ревью Go: sentinel-ошибки, typed nil и panic
Дженерики
Параметры типов, ограничения, comparable и cmp.Ordered, вывод типов, когда дженерики не нужны.
Урок: Дженерики в Go 6 мин- any и interface{}
- Ограничение comparable
- Интерфейс с набором типов как тип переменной
- Обобщённая функция суммы
- Обобщённый потокобезопасный кеш
- Дженерики в Go на собеседовании
- Итераторы iter.Seq в Go 1.23
- Параметры типов у методов
Ещё 12 вопросов и задач
- cmp.Ordered
- Обобщённые пакеты стандартной библиотеки
- Как компилируются дженерики Go
- Что значит ~int в ограничении
- Когда дженерики, а когда интерфейсы
- Нулевое значение параметра типа
- Обобщённое множество Set[T] на Go
- Обобщённая GroupBy и агрегаты на Go
- Обобщённая очередь на кольцевом буфере на Go
- Что выведет Go: обобщённые Map и Filter
- Что выведет Go: итератор iter.Seq и break
- Что выведет Go: ограничение с тильдой и свой тип
Горутины и планировщик GMP
Горутина против потока, модель G, M, P, вытеснение, GOMAXPROCS, утечки горутин.
Урок: Горутины и планировщик GMP 7 мин- GOMAXPROCS в контейнере
- Что такое P в модели GMP
- Что задаёт GOMAXPROCS
- Утечка горутины на канале
- Горутина и поток ОС
- runtime.Gosched
- Утечки горутин
- Переменная цикла и горутины в Go 1.22
Ещё 16 вопросов и задач
- main не ждёт горутины
- G, M, P и компоненты рантайма
- Сетевой ввод-вывод и горутины
- Асинхронное вытеснение с Go 1.14
- Как работает планировщик Go
- Как растёт стек горутины
- Блокирующий системный вызов и P
- Work stealing в планировщике Go
- Параллельное умножение матриц по строкам на Go
- Подсчёт простых в диапазонах с ограничением горутин
- Параллельная сумма частей массива на горутинах
- Подсчёт слов по файлам в горутинах с общей мапой
- Что выведет Go: замыкания в цикле в Go 1.22+
- Что выведет Go: горутины пишут по индексу
- Код-ревью Go: параллельная загрузка URL
- Код-ревью Go: утечка горутин и тикеров
Каналы и select
Буферизованные и небуферизованные каналы, закрытие, nil-канал, select, таймауты, дедлоки.
Урок: Каналы и select 8 мин- Буферизованный и небуферизованный канал
- Направленные каналы
- Каналы в Go: всё на собеседовании
- Чтение из закрытого канала
- Устройство канала в рантайме
- len и cap у канала
- Операции с каналами в разных состояниях
- Выключение ветки select через nil
Ещё 18 вопросов и задач
- Операции с nil-каналом
- Приоритет в select
- select с default
- select с несколькими готовыми ветками
- Отправка в закрытый канал
- Таймаут на операцию через select
- Отправка в небуферизованный канал без читателя
- Кто закрывает канал при нескольких отправителях
- Батчер событий: размер пачки и сброс по тику
- Слияние отсортированных потоков из каналов
- Pipeline из трёх стадий на каналах
- Эстафета по кольцу горутин
- Что выведет Go: слияние каналов с выключением веток через nil
- Что выведет Go: range по закрытому буферизованному каналу
- Что выведет Go: неблокирующая отправка через select
- Что выведет Go: select с одним готовым каналом и nil-каналом
- Что выведет Go: синхронизация через небуферизованный канал
- Код-ревью Go: воркеры, закрытие канала и select с default
sync и атомики
Mutex и RWMutex, WaitGroup, Once, sync.Map, Pool, Cond, atomic, гонки данных и race detector.
Урок: sync и атомики 7 мин- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики
Ещё 15 вопросов и задач
- Атомики или мьютекс
- CompareAndSwap
- Флаг без синхронизации
- Копирование структуры с мьютексом
- Как устроен sync.Mutex
- Мьютекс или канал
- sync.Once и паника
- Как найти и исправить гонку данных
- Что гарантирует sync.Pool
- Гонка на счётчике из горутин
- Детектор гонок
- Повторный Lock в той же горутине
- Когда RWMutex лучше Mutex
- Когда использовать sync.Map
- wg.Add внутри горутины
context
Отмена и дедлайны, дерево контекстов, WithCancelCause, WithoutCancel, AfterFunc, значения в контексте.
Урок: context в Go 6 мин- context.AfterFunc
- Распространение отмены context
- WithCancelCause и Cause
- Как устроен context внутри
- Тип ключа для context.WithValue
- Прерывает ли context выполнение
- Зачем нужен context в Go
- Правила работы с context
Ещё 13 вопросов и задач
- Дедлайн потомка и родителя
- Зачем вызывать cancel
- Что возвращает ctx.Err()
- Таймаут на запрос к базе
- Контекст HTTP-запроса
- Что класть в context.WithValue
- context.WithoutCancel
- Параллельный поиск первого вхождения с отменой
- Отмена задач по первой ошибке через context
- Симуляция дерева context: отмена и дедлайны
- Что выведет Go: ошибки контекста после отмены
- Что выведет Go: поиск значений в цепочке контекстов
- Код-ревью Go: context в HTTP-обработчике
Паттерны конкурентности
Worker pool, pipeline, fan-in и fan-out, errgroup, семафор, rate limit, graceful shutdown.
Урок: Паттерны конкурентности в Go 8 мин- Backpressure и ограничение нагрузки в Go-сервисе
- Что даёт errgroup.WithContext
- errgroup.SetLimit и TryGo
- Fan-out и fan-in
- Закрытие выходного канала в fan-in
- Паттерн generator
- Порядок graceful shutdown
- Graceful shutdown Go-сервиса по шагам
Ещё 15 вопросов и задач
- Остановка pipeline при раннем выходе
- Зачем нужен worker pool
- Ограничение частоты запросов
- Порядок результатов в worker pool
- Семафор на буферизованном канале
- singleflight и лавина на кеш
- Спроектировать worker pool
- MapReduce подсчёта слов на горутинах и каналах
- Параллельный BFS по уровням на горутинах
- Параллельное хеширование строк SHA-256: fan-out и fan-in
- Параллельная сортировка слиянием с ограничением глубины
- Worker pool с сохранением порядка результатов
- Что выведет Go: слияние каналов fan-in
- Что выведет Go: pipeline из трёх стадий
- Код-ревью Go: параллельная обработка с ошибками
Память, GC и pprof
Стек и куча, escape analysis, трёхцветный GC, GOGC и GOMEMLIMIT, профилирование через pprof.
Урок: Память, сборщик мусора и pprof 8 минТесты, бенчмарки и модули
Табличные тесты, t.Run, моки через интерфейсы, бенчмарки и fuzzing, go.mod, версии и MVS.
Урок: Тесты, бенчмарки и модули 7 минnet/http и middleware
Handler и ServeMux с шаблонами Go 1.22, middleware, таймауты сервера, клиент и закрытие Body, graceful shutdown.
Урок: net/http и middleware 7 мин- Статистика access-логов: ошибки и p95 на Go
- Разбор сырого HTTP/1.1 запроса на Go
- Разбор query-строки URL с декодированием на Go
- Маршрутизатор с параметрами пути в стиле ServeMux
- Rate limiter на токен-бакете для middleware на Go
- Зачем закрывать resp.Body
- Таймаут http.DefaultClient
- Обработчики net/http и горутины
Ещё 14 вопросов и задач
- http.HandlerFunc
- Надёжный HTTP-клиент в Go
- HTTP-сервис на стандартной библиотеке
- Ограничение размера тела запроса
- MaxIdleConnsPerHost в http.Transport
- Порядок выполнения middleware
- Параметры пути в ServeMux Go 1.22
- Путь запроса через net/http
- Таймауты http.Server и slowloris
- http.Server.Shutdown
- Статус ответа в middleware
- Порядок записи заголовков и статуса
- Что выведет Go: порядок выполнения middleware
- Что выведет Go: выбор маршрута в ServeMux Go 1.22