Библиотека Go для собеса | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Mostrar más7 423
Suscriptores
-1224 horas
-237 días
-4530 días
Archivo de publicaciones
❓ Что делает
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 для собесаRepost from 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 для собеса⚡️ Highload на Go: System Design, Kubernetes и микросервисы под нагрузкой — новый курс на Mentorix
Highload глазами Go-инженера: как проектировать, писать и эксплуатировать сервисы, которые держат нагрузку. С расчётами и симуляциями, как на реальных собеседованиях.
⚙️ Внутри: перцентили и SLO, конкурентность и профилирование, кэширование, rate limiting, ретраи и circuit breaker, очереди, БД под нагрузкой, Kubernetes, system design
🧩 118 задач с автопроверкой — вся практика на Go
🎓 Сертификат · доступ навсегда
▶️ Часть уроков открыта — начать можно бесплатно
🏷 −50% — скидка действует 24 часа
19 990 ₽ → 9 995 ₽
➜ Забрать курс со скидкой
━━━━━━━━━━━━━━
Курс продвинутый — предполагает уверенный Go. Если хотите подтянуть базу, на платформе есть бесплатные курсы:
🧩 Тренажёр Go — 70 задач с автопроверкой
⚡️ Golang — основы языка
Сети для разработчиков: TCP/IP, HTTP, DNS
📚 Все бесплатные курсы Mentorix
❓ Как работает пробинг в 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 для собеса
Go: управление памятью. Массивы, слайсы и мапы. Бесплатный урок курса «Go-разработчик. Базовый уровень»
Память в Go кажется простой только до первого неожиданного поведения слайсов, лишних аллокаций или просадки производительности. Многие начинающие разработчики используют массивы, слайсы и мапы интуитивно, не понимая, как они устроены внутри. В результате код работает, но расходует больше памяти, становится медленнее под нагрузкой и сложнее в поддержке.
На открытом уроке 3 августа в 20:00 разберём, как устроена работа с памятью в Go и как выбирать подходящие структуры данных под конкретную задачу. Поговорим о различиях между массивами и слайсами, особенностях инициализации через make и new, работе с for range, указателями и копированием значений. Отдельно обсудим производительность коллекций, сложность операций с мапами и слайсами, а также влияние этих механизмов на скорость и эффективность приложений.
Урок не для тех, кто считает, что достаточно просто знать синтаксис Go и не хочет разбираться, как язык управляет памятью. Будет полезен разработчикам, которые хотят писать быстрый, предсказуемый и эффективный код для реальных проектов.
👉 Записаться: https://clc.to/UUCs3g
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
❓ Что будет, если вызвать
time.Sleep(0)
Вопреки распространённому мифу — практически ничего. time.Sleep с длительностью ≤ 0 сразу возвращает управление: горутина не «усыпляется» и не уступает планировщику. По сути это no-op.
Часто думают, что time.Sleep(0) отдаёт управление планировщику Go и позволяет переключиться на другие горутины. Но за это отвечает другая функция:
runtime.Gosched() // вот это уступает управление планировщику
Gosched() снимает текущую горутину с процессора и ставит в очередь, давая шанс другим. А time.Sleep(0) этого не делает — если нужен именно yield, используйте runtime.Gosched().
🐸 Библиотека Go для собесаRepost from 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 <- struct{}{}.
• Семафоры и ограничение параллелизма, где важен сам факт занятости слота, а не передаваемое значение.
done := make(chan struct{})
go func() {
// ... работа ...
close(done) // сигнализируем о завершении
}()
<-done // ждём сигнал
Почему именно struct{}, а не, например, chan bool: булев канал намекает, что значение (true/false) несёт смысл, хотя на деле его игнорируют. chan struct{} выражает намерение точнее — «данных нет, есть только событие» — и не тратит память на само значение.
🐸 Библиотека Go для собесаRepost from Proglib.academy | IT-курсы
📈 Скоро фраза «умею пользоваться AI» в резюме будет звучать так же странно, как сегодня «умею пользоваться Git»
Это просто станет частью профессии. А вот умение встроить AI в процесс разработки так, чтобы он действительно ускорял работу команды, останется конкурентным преимуществом 💡
🔜 На курсе «ИИ для разработчиков» участники работают со своими проектами и учатся делать AI частью ежедневной разработки: планировать задачи, писать код, проверять изменения, готовить PR и автоматизировать рутину.
До конца июля действует специальная цена — 59 990 ₽ вместо 79 990 ₽ 🥳 И получить бессрочный доступ ко всем материалам курса.
🔗 Посмотреть, как устроен курс
🏃♀️ Proglib Academy
😮💨 До конца июля сохраняются две приятные вещи: специальная цена и бессрочный доступ к материалам курса. Подробнее — в посте 👇
❓ Что такое руны в Go
Руна (тип
rune) — это один символ Unicode. По сути это синоним типа int32: под капотом руна хранит числовой код символа (так называемый code point).
Зачем это нужно: в Go строки хранятся в кодировке UTF-8, где один символ может занимать от 1 до 4 байт. Поэтому индексация строки по байтам (s[i]) вернёт именно байт, а не символ — и для не-ASCII текста это будут «половинки» символа.
Руны решают эту проблему: когда вы перебираете строку через range или преобразуете её в []rune, Go корректно разбивает её на цельные символы, а не на байты.
s := "Привет"
fmt.Println(len(s)) // 12 — байты
fmt.Println(len([]rune(s))) // 6 — символы
for i, r := range s {
fmt.Printf("%d: %c\n", i, r) // r имеет тип rune
}
🐸 Библиотека Go для собеса❓ Как в Lock-Free алгоритмах борются с бесконечными повторными попытками
Когда несколько потоков одновременно «крутят» CAS, часть из них может подолгу проваливать попытки и впустую жечь процессор. Чтобы этого избежать, применяют несколько приёмов:
• Экспоненциальный бэкофф. Перед следующей попыткой CAS поток выжидает интервал, увеличивая его с каждой неудачей (обычно со случайным разбросом, чтобы потоки не синхронизировались). Это снижает конкуренцию и нагрузку на CPU.
• Адаптивные алгоритмы. Поведение потоков подстраивается под метрики системы — уровень контеншена, загрузку процессора — и стратегия ожидания меняется на лету.
• Ограничение по времени/попыткам (timed wait). Если CAS не удаётся за отведённое число попыток или время, поток прекращает спин и переходит на fallback-путь.
• Гибридный подход (hybrid locking). В качестве резерва подключаются мьютексы или другие блокирующие примитивы, когда неблокирующий путь себя не оправдывает.
Итог: цель всех этих механизмов — превратить «бесконечный спин» в контролируемое ожидание и не дать потокам молотить процессор вхолостую.
🐸 Библиотека Go для собеса
Repost from Proglib.academy | IT-курсы
😸 Каждый разработчик подходит к задаче со своим опытом: помнит прошлые решения, знает ограничения проекта и понимает, какой код команда пропустит на ревью.
Для человека это естественная часть работы. У Claude Code этого контекста по умолчанию нет — только задача и инструкции, которые ему дали.
Поэтому в большой команде недостаточно просто выбрать хорошую модель. ❗️ Нужно ещё объяснить ей, как у вас устроена разработка: какие подходы приняты, что обязательно проверять и по каким правилам принимать решения.🗓 23 июля в 19:00 МСК поговорим об этом на бесплатном вебинаре с Алексеем Жиряковым — он Executive Director в Сбере, руководит GenAI Data Platform, и с этой проблемой сталкивался не раз 🔥 Покажет живое демо, разберём, как встроить AI в процесс разработки так, чтобы он реально помогал, а не добавлял ещё один повод для споров на ревью. 🔗 Занять место на вебинаре 🏃♀️ Proglib Academy
❓ Что такое трэшинг в контексте кэширования
Трэшинг — это состояние, при котором данные в кэше постоянно вытесняются новыми ещё до того, как успевают быть повторно использованными. В результате система почти при каждом запросе обращается к основному источнику (например, к базе данных) вместо того, чтобы брать данные из кэша.
Итог — резкое падение производительности: кэш формально работает, но своей главной задачи не выполняет, ведь смысл кэширования как раз в ускорении доступа к часто используемым данным.
Чаще всего трэшинг возникает, когда объём «горячих» данных превышает размер кэша или когда стратегия вытеснения плохо подходит под характер нагрузки.
🐸 Библиотека Go для собеса
❓ Как вам вопросы этой недели
