uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

Библиотека Go для собеса | вопросы с собеседований

Библиотека 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 действует акция: покупаешь один кур
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше. В 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 можно выбрать два курса
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция! До 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 для собеса

👀 Как вы смотрите видео? Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране? Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить. 🕰️ Опрос займёт около 3 минут. В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео. 🔗 Поделиться опытом 🐸 Библиотека программиста

🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum [ + эталонные ответы на 50 сложных вопросов в пода
🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum [ + эталонные ответы на 50 сложных вопросов в подарок ] В четверг, 8 октября, в 19:00 МСК приходи онлайн на тестовое собеседование. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью. Интервьюер: Маруф Караев — Senior Software Engineer из Гамбурга, ex-Yandex, ex-Uzum. Как это будет: 📂 Маруф задаст разработчику-добровольцу те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает; 📂 После каждого ответа Маруф даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе; 📂 В конце сможешь задать Маруфу любой вопрос и получить развёрнутый ответ; Эфир проходит в рамках менторской программы ШОРТКАТ для Go-разработчиков, которые хотят сменить работу и вырасти в грейде и зарплате. 🎁 Подарок для всех, кто зарегается на веб: файл с эталонными ответами на 50 сложных вопросов с Go-интервью 🔥 Жми на кнопку, чтобы попасть на эфир и забрать подарок ↓ @shortcut_go_bot Реклама. О рекламодателе.

А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику Tproger, Proglib, Столото, Центральны
А вы уже забрали свой подарок ко Дню программиста? К вашему профессиональному празднику 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. Бесплатный урок курса «Go-разработчик. Базовый уровень» Конкурентность — одна из главных особенностей Go, но именно здесь начинающие разработчики чаще всего сталкиваются с трудноуловимыми ошибками. Неправильная работа с горутинами, каналами или синхронизацией может привести к состояниям гонки, взаимным блокировкам и утечкам ресурсов, которые сложно найти и исправить. На открытом уроке 18 августа в 20:00 разберём, как устроен параллелизм в Go и как безопасно использовать горутины в своих проектах. Поговорим о различиях между горутинами и системными потоками, научимся запускать параллельные задачи, организовывать обмен данными через каналы и применять базовые механизмы синхронизации. Урок будет полезен разработчикам, которые хотят уверенно использовать конкурентность Go в реальных приложениях. 👉 Записаться: https://otus.pw/iA0G/?erid=2W5zFGzTDry Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

❓ Объясните разницу между безопасным доступом к байтам строки через срез и использованием unsafe Когда строку преобразуют в срез байтов, создаётся новая копия данных, и доступ к этим данным безопасен, но это также означает, что данные строки не изменяются. unsafe позволяет работать с указателями и памятью напрямую, что даёт больше гибкости, но это также приводит к неопределённому поведению, если использовать эти указатели для изменения данных. 🐸 Библиотека Go для собеса

Покупать новый курс каждый раз, когда меняется рабочая задача, — довольно странная механика. Нашли альтернативу 👇

👅 Самое сложное — выбрать не курс, а направление Сегодня хочется разобраться в AI-агентах. Через пару недель появляется зада
👅 Самое сложное — выбрать не курс, а направление Сегодня хочется разобраться в 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 для собеса