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


Гео и язык канала: Россия, Русский
Категория: Технологии


Вопросы с собеседований по Go и ответы на них.
Учиться у нас: clc.to/iEeaZw
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
Наши каналы: https://t.me/proglibrary/9197

Связанные каналы  |  Похожие каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций


🎓 Тестовый собес с Go Senior из Гамбурга, с опытом работы в Yandex и Uzum
[ + эталонные ответы на 50 сложных вопросов в подарок ]


В четверг, 8 октября, в 19:00 МСК приходи онлайн на тестовое собеседование. Можно посмотреть, как всё устроено изнутри, и понять, насколько ты готов к такому интервью.

Интервьюер: Маруф Караев — Senior Software Engineer из Гамбурга, ex-Yandex, ex-Uzum.

Как это будет:

📂 Маруф задаст разработчику-добровольцу те вопросы и задачи, которые даёт кандидатам на своих интервью. Заранее их никто не знает;

📂 После каждого ответа Маруф даст обратную связь: что прозвучало сильно, а что стоило раскрыть иначе. Так станет понятнее, на что обращают внимание на собесе;

📂 В конце сможешь задать Маруфу любой вопрос и получить развёрнутый ответ;

Эфир проходит в рамках менторской программы ШОРТКАТ для Go-разработчиков, которые хотят сменить работу и вырасти в грейде и зарплате.

🎁 Подарок для всех, кто зарегается на веб:
файл с эталонными ответами на 50 сложных вопросов с Go-интервью 🔥

Жми на кнопку, чтобы попасть на эфир и забрать подарок ↓
@shortcut_go_bot

Реклама.
О рекламодателе.


❓ Какой максимальный размер бинарного файла можно собрать

В 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.

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

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

🔗 Зарегистрироваться на вебинар⁠


❓ Объясните разницу между безопасным доступом к байтам строки через срез и использованием unsafe

Когда строку преобразуют в срез байтов, создаётся новая копия данных, и доступ к этим данным безопасен, но это также означает, что данные строки не изменяются.

unsafe позволяет работать с указателями и памятью напрямую, что даёт больше гибкости, но это также приводит к неопределённому поведению, если использовать эти указатели для изменения данных.

🐸 Библиотека Go для собеса


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


Репост из: 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 для собеса


❓ Что делает CGO_ENABLED

CGO_ENABLED — это переменная окружения, которая включает или выключает CGo при сборке Go-приложений. Принимает два значения: 1 (включено) и 0 (выключено).
CGo — это механизм, позволяющий Go-коду взаимодействовать с C: вызывать C-функции и использовать C-библиотеки прямо из Go-программы.

Зачем этим управлять:

• CGO_ENABLED=0 даёт полностью статический бинарник без зависимостей от системных C-библиотек — удобно для минимальных Docker-образов (scratch, alpine) и упрощает кросс-компиляцию.

• CGO_ENABLED=1 нужен, когда проект реально использует C-код или библиотеки, завязанные на cgo

CGO_ENABLED=0 GOOS=linux go build -o app

Важный нюанс: по умолчанию CGo включён, но при кросс-компиляции (когда GOOS/GOARCH отличаются от хостовых) Go автоматически отключает его, если не задан C-кросс-компилятор.

🐸 Библиотека Go для собеса


Репост из: Proglib.academy | IT-курсы
🎯 У разработчика, DevOps-инженера и техлида разные причины задуматься о системной работе с AI-агентами

Но цель одна: перейти от случайных удачных запусков к управляемому процессу на реальном проекте — с понятными правилами, ревью, контролем расходов и безопасности ✔️

На курсе «ИИ для разработчиков» участники выстраивают такой процесс на практике: подключают инструменты, задают границы для агента и учатся понимать, где ему можно доверять работу, а где требуется проверка.

⚡️ Предзапись на осенний поток уже открыта

🏃‍♀️ Proglib Academy


Разработчику нужен стабильный результат, DevOps — контроль инфраструктуры, техлиду — правила для всей команды. Собрали это в одном посте 👇


❓ Что делает переменная окружения GOOS в Go

GOOS задаёт целевую операционную систему, под которую компилируется Go-приложение. Она используется при кросс-компиляции — когда код пишется на одной платформе, а собирается под другую (часто в паре с GOARCH, задающей архитектуру процессора).
GOOS=linux GOARCH=amd64 go build

Основные значения
GOOS (именно в таком виде, в нижнем регистре):
linux
windows
darwin — macOS (не macos)
ios
android
freebsd
openbsd
netbsd
plan9

Полный актуальный список можно получить командой go tool dist list.

🐸 Библиотека Go для собеса


❓ Как работает пробинг в Swiss Table

1. Считается хеш ключа и делится на две части.

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

H1 (старшие 57 бит) — выбирает стартовую группу;
H2 (младшие 7 бит) — «отпечаток» (fingerprint) ключа.

2. Внутри группы контрольные байты проверяются параллельно через SIMD.
Каждая группа — это 8 слотов и 8-байтовый control word, где каждый байт хранит H2 своего слота. Одной SIMD-инструкцией H2 искомого ключа сравнивается сразу со всеми 8 байтами → получаем маску кандидатов. Только для совпавших по fingerprint слотов сверяется полный ключ.

3. Если совпадений нет и пустого слота в группе тоже нет — переходим к следующей группе.
Пробинг идёт по группам квадратично, но по треугольным числам:
offset = (offset + i) mod size, i = 1, 2, 3, 4...
→ смещения: h, h+1, h+3, h+6, h+10, ...

Такая последовательность гарантированно обходит всю таблицу (при размере — степени двойки) и снижает кластеризацию. Если встретился пустой слот — ключа в таблице нет, поиск останавливается.

🐸 Библиотека Go для собеса


❓ Что будет, если вызвать time.Sleep(0)

Вопреки распространённому мифу — практически ничего. time.Sleep с длительностью ≤ 0 сразу возвращает управление: горутина не «усыпляется» и не уступает планировщику. По сути это no-op.

Часто думают, что time.Sleep(0) отдаёт управление планировщику Go и позволяет переключиться на другие горутины. Но за это отвечает другая функция:
runtime.Gosched() // вот это уступает управление планировщику
Gosched() снимает текущую горутину с процессора и ставит в очередь, давая шанс другим. А time.Sleep(0) этого не делает — если нужен именно yield, используйте runtime.Gosched().

🐸 Библиотека Go для собеса


Репост из: Proglib.academy | IT-курсы
У вас в проекте есть файл вроде utils_v2_final_FIX.py, который все боятся трогать ❓

Что делаете с таким легаси?

❤️ Не трогаю: работает — и ладно
👍 Переписываю с нуля и надеюсь на лучшее
🔥 Сначала покрываю тестами, потом рефакторю по частям
👾 У нас такого нет — честно-честно

На курсе «ИИ для разработчиков» разберём третий подход: как с помощью агента зафиксировать текущее поведение легаси-кода тестами, а затем менять его небольшими безопасными шагами — без одного огромного PR на тысячу файлов.

До 31 июля действует скидка и бессрочный доступ к материалам.

🔗 Занять место со скидкой

🏃‍♀️ Proglib Academy


Когда название файла уже само по себе считается техническим долгом 👇


❓ Что такое fallthrough в Go

fallthrough — это ключевое слово внутри switch, которое передаёт управление следующему case, не проверяя его условие.

В отличие от C и многих других языков, в Go switch по умолчанию не «проваливается» дальше: выполнение завершается сразу после первого совпавшего case, без явного break. fallthrough включает обратное поведение — принудительный переход к следующему блоку.

switch n {
case 1:
fmt.Println("один")
fallthrough
case 2:
fmt.Println("два") // выполнится, даже если n == 1
default:
fmt.Println("другое")
}

Важные нюансы:

• fallthrough передаёт управление безусловно — условие следующего case игнорируется.

• Он должен стоять последним оператором в case, иначе будет ошибка компиляции.

• Из последнего case (или default, если он в конце) провалиться некуда — там fallthrough использовать нельзя.

🐸 Библиотека Go для собеса


❓ В чём разница между //go:build и // +build

Обе директивы — это build constraints (ограничения сборки), которые указывают компилятору, при каких условиях включать файл в сборку. Разница в синтаксисе и возрасте.

// +build — старая форма, использовавшаяся до Go 1.17:

• Размещается в начале файла, до объявления пакета.

• После блока директив обязательна пустая строка.

• Условия комбинируются неочевидно: пробел означает «И», запятая — «ИЛИ», а несколько строк — тоже «И». Это часто путало.

//go:build — новая форма, введённая в Go 1.17:

• Использует привычные логические выражения с &&, ||, ! и скобками.

• Читается гораздо понятнее.

// Старая форма:
// +build linux,amd64 darwin

// Новая форма:
//go:build (linux && amd64) || darwin

Начиная с Go 1.17, инструмент gofmt автоматически добавляет //go:build рядом со старыми // +build, синхронизируя их. Сегодня рекомендуется использовать именно //go:build, а старую форму оставляют лишь для совместимости со совсем древними версиями Go.

🐸 Библиотека Go для собеса


❓ Что особенного в chan struct{}

chan struct{} — это канал, по которому передаётся не данные, а сам факт сигнала. Пустая структура struct{} не занимает памяти (0 байт), поэтому такой канал явно говорит читателю кода: «здесь важно только событие, а не его содержимое».

Типичные сценарии:

• Сигнал завершения / отмены. Закрытие канала (close(done)) разом оповещает всех, кто его слушает.

• Синхронизация горутин. Одна горутина ждёт, пока другая пошлёт сигнал ch


Репост из: Proglib.academy | IT-курсы
📈 Скоро фраза «умею пользоваться AI» в резюме будет звучать так же странно, как сегодня «умею пользоваться Git»

Это просто станет частью профессии. А вот умение встроить AI в процесс разработки так, чтобы он действительно ускорял работу команды, останется конкурентным преимуществом 💡

🔜 На курсе «ИИ для разработчиков» участники работают со своими проектами и учатся делать AI частью ежедневной разработки: планировать задачи, писать код, проверять изменения, готовить PR и автоматизировать рутину.

До конца июля действует специальная цена — 59 990 ₽ вместо 79 990 ₽ 🥳 И получить бессрочный доступ ко всем материалам курса.

🔗 Посмотреть, как устроен курс

🏃‍♀️ Proglib Academy


😮‍💨 До конца июля сохраняются две приятные вещи: специальная цена и бессрочный доступ к материалам курса. Подробнее — в посте 👇

Показано 20 последних публикаций.