Библиотека Go для собеса | вопросы с собеседований
Відкрити в Telegram
Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Показати більше7 423
Підписники
-1224 години
-237 днів
-4530 днів
Архів дописів
❓ Разрешает ли ограничение comparable использовать оператор меньше в обобщённой функции?
Ответ: Нет. comparable позволяет сравнивать значения через == и !=, но не гарантирует возможность упорядочить их через <.
Например, логические значения и некоторые структуры можно сравнивать на равенство. Но выражения true < false или сравнение двух структур через < недопустимы.
Поэтому функция с параметром типа T comparable не может просто выполнить a < b. Компилятор должен знать, что эта операция допустима для всех типов, разрешённых ограничением.
Для обобщённого сравнения целых и вещественных чисел, а также строк можно использовать cmp.Ordered из стандартной библиотеки. Если функция должна работать только с выбранными целочисленными типами, задают более узкое ограничение.
На собеседовании важно различать проверку равенства и отношение порядка: для них нужны разные требования к типу.
Подробнее в документации Go и cmp.Ordered
🐸 Библиотека Go для собеса
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета. А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога. Акция действует до 31 октября включительно ⏳ ⏮️ Пора прокачать свой стек
❓ Почему горутина может зависнуть при отправке ошибки после тайм-аута вызывающей функции?
Ответ: Потому что вызывающая функция уже перестала читать канал, а отправитель всё ещё пытается в него записать.
Представьте: работник выполняет запрос и отправляет ошибку в небуферизованный канал. Вызывающая сторона ждёт либо результат, либо тайм-аут. Тайм-аут сработал, функция вернулась, а работник позже дошёл до отправки. Получателя больше нет — горутина блокируется.
Если работник гарантированно отправляет ровно одно сообщение, канал с буфером на один элемент позволит ему отправить результат и завершиться даже после ухода получателя. Но для произвольного числа сообщений такой буфер проблему не решает.
Другой вариант — отправка через select с альтернативой по отмене контекста. Тогда работник может отказаться от отправки, если результат уже не нужен. Саму долгую операцию тоже нужно по возможности выполнять с поддержкой отмены.
Подробнее в документации Go
🐸 Библиотека Go для собеса
❓ Гарантирует ли вызов cancel, что горутина уже завершилась?
Ответ: Нет. cancel сообщает об отмене, но не ждёт завершения работы.
Горутина должна сама заметить отмену: например, выбрать ветку с ctx.Done() или получить ошибку от операции, которой передали контекст. Если она зависла в операции, не поддерживающей отмену, вызов cancel сам по себе её не остановит.
Поэтому отмена и ожидание — две отдельные части протокола завершения. Сначала вызывающая сторона подаёт сигнал через cancel, затем ждёт подтверждения: через WaitGroup, отдельный канал завершения или другой механизм координации.
Это особенно важно перед освобождением ресурсов. Нельзя считать, что после cancel фоновая горутина уже перестала обращаться к файлу, соединению или общим данным.
Подробнее в документации Go
🐸 Библиотека Go для собеса
❓ Можно ли вызвать Lock, уже удерживая RLock того же RWMutex?
Ответ: Нет. RWMutex не поддерживает повышение блокировки чтения до блокировки записи.
Если горутина удерживает RLock и вызывает Lock того же мьютекса, Lock ждёт освобождения всех блокировок чтения. В том числе той, которую удерживает сама горутина. Если освободить её некому, получится взаимная блокировка.
Вариант RUnlock, затем Lock не является атомарным повышением: между этими вызовами данные может изменить другая горутина.
Например, вы проверили под RLock, что ключа нет в map, затем отпустили блокировку и получили Lock. Перед вставкой отсутствие ключа нужно проверить заново.
Если заранее известно, что операция может изменить данные, иногда проще сразу взять Lock и выполнить всю проверку вместе с изменением под одной блокировкой.
Подробнее в документации Go
🐸 Библиотека Go для собеса
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция!
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥 Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога. Акция действует до 31 октября включительно ⏳ ⏬ Собрать свой учебный билд
❓ Почему sync.Cond.Wait нужно вызывать в цикле, а не внутри if?
Ответ: Потому что пробуждение не гарантирует, что нужное состояние всё ещё сохраняется.
Wait атомарно отпускает связанную блокировку и приостанавливает горутину. Перед возвратом он снова захватывает блокировку. За это время другая горутина могла изменить данные.
Например, после Broadcast проснулись два потребителя. Первый захватил мьютекс и забрал единственный элемент очереди. Когда второй получил блокировку, очередь уже пуста — хотя уведомление он тоже получил.
Поэтому условие проверяют под блокировкой в цикле: пока очередь пуста — вызывают Wait; после возврата проверяют её ещё раз.
В Go Wait не возвращается без Signal или Broadcast. Цикл нужен не из-за «случайных пробуждений», а потому что уведомление не закрепляет состояние за конкретной горутиной.
Подробнее в документации Go
🐸 Библиотека Go для собеса
Почему MaxBytesReader полезнее LimitReader для тела HTTP-запроса?
io.LimitReader прекращает чтение после лимита, как будто наступил EOF. Читатель не узнает, что исходное тело было длиннее.
http.MaxBytesReader сообщает о превышении через MaxBytesError. Он возвращает ReadCloser, а его Close закрывает исходное тело. Если ResponseWriter это поддерживает, превышение также может привести к закрытию соединения.
Проверка на Go 1.27.2: вход «abcd», лимит три байта. ReadAll через LimitReader вернул «abc» и nil. Через MaxBytesReader — те же «abc», но с ошибкой и значением Limit = 3.
Разница важна для API: обрезанный JSON и слишком большой запрос — разные ситуации. В обработчике задавайте лимит перед декодированием и отдельно обрабатывайте MaxBytesError. Но сам лимит не означает, что валидатор проверил содержимое запроса.
Контракт MaxBytesReader
Библиотека Go для собесаПочему synctest.Wait не означает «все горутины закончились»?
Wait ждёт, пока остальные горутины в тестовом пузыре станут durably blocked или завершатся. Это состояние, из которого их может вывести только событие внутри того же пузыря.
Горутина, спящая через time.Sleep, может оставаться живой, а Wait уже вернётся. В проверке на Go 1.27.2 сначала Wait оставил флаг незавершённым. После десяти секунд виртуального сна и ещё одного Wait флаг изменился. Десять настоящих секунд тест не ждал.
Когда весь пузырь заблокирован, сначала возвращается ожидающий Wait. Если такого ожидания нет, виртуальные часы переходят к ближайшему таймеру. Это позволяет отделить «дошли до точки ожидания» от «прошло нужное время».
Чтение реального сетевого сокета и ожидание Mutex не считаются durably blocking. Поэтому synctest не превращает любой HTTP-тест в мгновенный. Для него нужны изолированные горутины и подходящие fake-зависимости.
Контракт testing/synctest
Библиотека Go для собесаRepost from Библиотека программиста
👀 Как вы смотрите видео?
Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?
Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.
🕰️ Опрос займёт около 3 минут.
В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.
🔗 Поделиться опытом
🐸 Библиотека программиста
🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum
[ + эталонные ответы на 50 сложных вопросов в подарок ]
В четверг, 8 октября, в 19:00 МСК приходи онлайн на тестовое собеседование. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.
Интервьюер: Маруф Караев — Senior Software Engineer из Гамбурга, ex-Yandex, ex-Uzum.
Как это будет:
📂 Маруф задаст разработчику-добровольцу те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;
📂 После каждого ответа Маруф даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;
📂 В конце сможешь задать Маруфу любой вопрос и получить развёрнутый ответ;
Эфир проходит в рамках менторской программы ШОРТКАТ для Go-разработчиков, которые хотят сменить работу и вырасти в грейде и зарплате.
🎁 Подарок для всех, кто зарегается на веб:
файл с эталонными ответами на 50 сложных вопросов с Go-интервью 🔥
Жми на кнопку, чтобы попасть на эфир и забрать подарок ↓
@shortcut_go_bot
Реклама.
О рекламодателе.
А вы уже забрали свой подарок ко Дню программиста?
К вашему профессиональному празднику Tproger, Proglib, Столото, Центральный университет и SmartApe собрали целую коробку подарков. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/tE1M
Реклама. ИП Михайлишина Гузель Фаниловна, erid: 2W5zFJrVGHw
❓ Какой максимальный размер бинарного файла можно собрать
В Go нет встроенного ограничения на размер бинарника. Теоретический предел это ресурсы машины, на которой идёт компиляция: свободное место на диске и доступная память.
Размер бинарника растёт из-за нескольких вещей:
Статическая линковка. Go по умолчанию собирает всё в один файл — рантайм, стандартная библиотека, все зависимости. Никаких внешних .so или .dll. Это удобно при деплое, но увеличивает размер даже у простой программы.
Встроенные ресурсы. Через //go:embed можно упаковать в бинарник статику, шаблоны, миграции. Добавили папку с фронтендом — бинарник вырос на её размер.
Отладочная информация. По умолчанию Go включает в бинарник DWARF-символы и таблицы имён. Это нужно для профилировщика и стектрейсов, но добавляет вес.
Если размер важен, его можно уменьшить флагами линковщика:
go build -ldflags="-s -w" -o app .
-s убирает таблицу символов, -w отключает DWARF. Бинарник становится меньше на 20–30%, но отладка по нему будет затруднена.
Дополнительно можно прогнать через upx — утилита сжимает исполняемый файл, он распаковывается уже в памяти при запуске.
🐸Библиотека Go для собеса
😭 Как не потратить недельный лимит AI-кодинга за три дня?
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
🔘 Поговорим о том:
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.
⬇️ 18 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок
💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре.
🔗 Зарегистрироваться на вебинар
Вам доклады по Go или Java? VK приглашает на митап с двойной начинкой
26 августа VK собирает Go- и Java-инженеров, чтобы прокачать знания.
В программе два трека — Go и Java, по три доклада в каждом.
Трек Go:
• «Компиляция Go в динамическую либу, или как мы ускорили выкатку фичи в два раза, но нам не понравилось», Михаил Кичигин, бэкенд-разработчик, Avito Tech
• «Go-платформа VK: как мы построили единую основу для создания Go-сервисов», Александр Апанасенко, руководитель команды SDK Backend, VK
• «Почтальон от Kubernetes до Palo Alto. Как осуществляется доставка информации об адресах», Дарья Кулькина, бэкенд-разработчик, Точка Банк
Трек Java:
• «Перформанс-трюки в поисковой платформе Ozon», Пётр Портнов, ведущий разработчик среднего поиска, Ozon
• «Архитектура современного движка платёжной системы и переход к новой архитектуре», Игорь Крикунов, технический лидер разработки DBC, Альфа-Банк
• «Переход от федерации S3-кластеров в пользу коммунального и мультитенантного кластера», Кирилл Боблак, ведущий разработчик One-cloud, VK
А ещё будет мастер-класс по прокачке навыка, который сделает вас звездой любого вечера, и афтепати, чтобы обсудить доклады в неформальной обстановке.
Встречаемся в 17:00, начало в 18:00. Участие бесплатное, регистрация обязательна.
Горутины и каналы: основы параллелизма в Go. Бесплатный урок курса «Go-разработчик. Базовый уровень»
Конкурентность — одна из главных особенностей Go, но именно здесь начинающие разработчики чаще всего сталкиваются с трудноуловимыми ошибками. Неправильная работа с горутинами, каналами или синхронизацией может привести к состояниям гонки, взаимным блокировкам и утечкам ресурсов, которые сложно найти и исправить.
На открытом уроке 18 августа в 20:00 разберём, как устроен параллелизм в Go и как безопасно использовать горутины в своих проектах. Поговорим о различиях между горутинами и системными потоками, научимся запускать параллельные задачи, организовывать обмен данными через каналы и применять базовые механизмы синхронизации.
Урок будет полезен разработчикам, которые хотят уверенно использовать конкурентность Go в реальных приложениях.
👉 Записаться: https://otus.pw/iA0G/?erid=2W5zFGzTDry
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
❓ Объясните разницу между безопасным доступом к байтам строки через срез и использованием unsafe
Когда строку преобразуют в срез байтов, создаётся новая копия данных, и доступ к этим данным безопасен, но это также означает, что данные строки не изменяются.
unsafe позволяет работать с указателями и памятью напрямую, что даёт больше гибкости, но это также приводит к неопределённому поведению, если использовать эти указатели для изменения данных.
🐸 Библиотека Go для собеса
Покупать новый курс каждый раз, когда меняется рабочая задача, — довольно странная механика. Нашли альтернативу 👇
Repost from Proglib.academy | IT-курсы
👅 Самое сложное — выбрать не курс, а направление
Сегодня хочется разобраться в AI-агентах. Через пару недель появляется задача, где нужны алгоритмы. Потом понимаешь, что неплохо бы освежить Python или математику для Data Science.
🔜 Именно поэтому подписка на обучение многим оказывается удобнее отдельных курсов. Можно спокойно переключаться между темами, когда меняются задачи, а не покупать новую программу каждый раз.
В подписку Proglib Academy входят все основные направления — AI, ML, Python, алгоритмы, математика для DS и другие курсы, а ещё закрытый видеохаб с вебинарами практиков.Начать можно с пробного месяца. Если решите остаться, его стоимость зачтётся при оформлении подписки 😎 🔗 Узнать подробнее 🏃♀️ Proglib Academy
❓ Как создать свою кастомную ошибку в Go
• Пакет
errors — самый быстрый способ
Подходит для простых статичных ошибок. Такую переменную удобно объявить один раз и сравнивать через errors.Is.
var ErrNotFound = errors.New("запись не найдена")
• fmt.Errorf() — когда нужен контекст
Позволяет подставить в текст детали. А глагол %w ещё и «оборачивает» исходную ошибку, сохраняя цепочку для errors.Is / errors.Unwrap.
return fmt.Errorf("не удалось загрузить юзера %d: %w", id, ErrNotFound)
• Кастомный тип через struct — максимум гибкости
Нужен, когда к ошибке хочется прикрепить данные (код, поле, статус). Достаточно реализовать метод Error() string — и тип становится ошибкой.
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}
Такую ошибку потом можно вытащить через errors.As и прочитать её поля.
🐸 Библиотека Go для собеса