Библиотека Go для собеса | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по Go и ответы на них. Покажем, как запустить своего ии-агента: https://clc.to/tvpmD По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Mostrar más7 429
Suscriptores
-324 horas
-167 días
+930 días
Archivo de publicaciones
❓ Что такое sync.WaitGroup
sync.WaitGroup — это примитив синхронизации из стандартного пакета sync, предназначенный для ожидания завершения группы горутин.
WaitGroup использует внутренний счётчик:
• Счётчик увеличивается при добавлении новых задач
• Уменьшается при завершении каждой задачи
• Когда счётчик достигает нуля — все задачи выполнены
Пример использования:
func main() {
var wg sync.WaitGroup
numWorkers := 3
wg.Add(numWorkers) // Устанавливаем счётчик равным количеству горутин
for i := 1; i <= numWorkers; i++ {
go worker(i, &wg) // Запускаем горутины
}
wg.Wait() // Блокируемся до завершения всех горутин
fmt.Println("Все горутины завершены")
}
🐸 Библиотека Go для собеса❓ Что происходит, когда у слайса не хватает ёмкости для добавления элемента
Под капотом:
1. Выделяется новый массив с большей ёмкостью
2. Копируются все существующие элементы в новый массив
3. Добавляется новый элемент
4. Возвращается новый слайс, указывающий на новый массив
Четвёртый пункт — это одна из причин, почему важно всегда присваивать результат
append(). Старый слайс может указывать на старый массив, а новый слайс — на новый.
🐸 Библиотека Go для собеса❓ Какой тип не может быть константой
Константы могут быть только базовых типов: булевые, числовые, строковые или руны. Составные типы вроде срезов, мап и структур не могут быть константами, поскольку они требуют выделения памяти во время выполнения и не вычисляются полностью на этапе компиляции.
🐸 Библиотека Go для собеса
❓ Почему при передаче слайса в функцию изменения элементов видны снаружи функции
Слайс — это структура из трех полей: указатель на базовый массив, длина и ёмкость. Когда вы передаете слайс в функцию, копируется эта структура, но указатель внутри неё продолжает ссылаться на тот же базовый массив.
Однако если вы делаете append и слайс перевыделится, то внутри функции слайс начинает указывать на новый массив, а снаружи остается ссылка на старый.
🐸 Библиотека Go для собеса
Примитивы синхронизации в Go
Конкурентность — одно из ключевых преимуществ Go, но именно здесь начинающие разработчики чаще всего сталкиваются с гонками данных, дедлоками и нестабильным поведением приложений. Без понимания примитивов синхронизации писать надёжный Go-код невозможно.
На открытом уроке разберём, зачем в Go нужна синхронизация и как правильно работать с общими ресурсами при использовании горутин. Рассмотрим Mutex и RWMutex, семафоры, WaitGroup, atomic-операции и sync.Once. Поговорим о типичных ошибках, а также о том, как отлаживать и тестировать конкурентный код.
Урок будет полезен начинающим Go-разработчикам, которые уже знакомы с горутинами, а также разработчикам на других языках, желающим глубже понять модель многопоточности в Go.
→ Этот вебинар проходит в формате открытого урока курса «Golang Developer. Basic»: https://clc.to/szIokQ
Реклама. ООО «Отус онлайн‑образование», ОГРН 1177746618576
❓ Что такое TUI и чем он отличается от GUI
TUI — текстовый пользовательский интерфейс, работающий в терминале. В отличие от GUI использует символы для отрисовки интерфейса, работает в консоли.
Примеры TUI: midnight commander, htop, vim. Примеры GUI: VSCode, браузеры, графические редакторы.
🐸 Библиотека Go для собеса
❓ Как вам вопросы прошедшей недели
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
🐸 Библиотека Go для собеса
❓ В чём разница между стеком и хипом
Два разных участка памяти с противоположными характеристиками.
Stack работает по принципу LIFO (последний зашёл — первый вышел). Быстрый, автоматически управляемый, ограниченный по размеру. Здесь живут локальные переменные и параметры функций. Память освобождается сразу при выходе из области видимости.
Heap — динамическая область памяти. Медленнее, требует ручного управления или сборщика мусора, практически неограниченный. Подходит для данных, которые должны жить дольше одной функции или имеют неизвестный размер на момент компиляции.
🐸Библиотека Go для собеса
❓ Можно ли передавать каналы в каналах
Да, поскольку каналы являются типами первого класса.
Пример:
package main
import (
"fmt"
"time"
)
func main() {
// Канал, который передаёт другие каналы типа int
chanOfChans := make(chan chan int)
// Горутина, которая создаёт и отправляет канал
go func() {
ch := make(chan int)
chanOfChans <- ch // Отправляем канал
ch <- 100 // Отправляем значение в этот канал
close(ch)
}()
// Получаем канал
receivedChan := <-chanOfChans
// Читаем из полученного канала
value := <-receivedChan
fmt.Printf("Получено значение: %d\n", value)
}
🐸Библиотека Go для собеса❓ Что произойдёт, если закрыть канал дважды
Закрытие канала — сигнал получателям о том, что данных больше не будет. После закрытия канала отправка в канал вызывает панику, чтение возвращает zero value типа и флаг false при проверке value, ok := <-ch, а повторное закрытие вызывает панику.
Полезный паттерн: использовать sync.Once для гарантии однократного закрытия или done-канал для координации завершения.
🐸Библиотека Go для собеса
Пятница, 19:00. Худшее время для деплоя, но идеальное, чтобы понять, как устроены ИИ-агенты под капотом, и блеснуть этими знаниями на собеседовании.
Gopher’ам тоже нужно понимать, как работают LLM. Сегодня на открытом уроке обсудим архитектурные паттерны современных ИИ-систем.
Ключевые вопросы:
— чем
RAG отличается от дообучения (`Fine-tuning`) в продакшене;
— векторные базы данных: когда и зачем они нужны;
— как собрать систему, отвечающую по PDF-файлам.
Один из спикеров — Алексей Яндутов, ML-инженер в поиске Яндекса.
Занятие проходит в рамках курса «Разработка AI-агентов». Это технический контент.
Записаться на урок❓ В чём отличие Int от UInt
Главное отличие — в диапазоне значений, которые можно хранить.
Int — это целое число со знаком. Может быть как положительным, так и отрицательным. Один бит уходит на хранение знака, поэтому диапазон делится пополам между положительными и отрицательными значениями.
UInt — беззнаковое целое число (U = unsigned). Хранит неотрицательные значения, начиная с нуля. Поскольку знак не нужен, все биты используются для хранения величины числа.
Практический пример для 8-битных типов:
Int8: от -128 до 127
UInt8: от 0 до 255
Оба занимают одинаковое количество памяти, но UInt может хранить в два раза большее положительное число за счёт отсутствия отрицательной части.
🐸Библиотека Go для собеса
❓ Зачем append возвращает слайс
append возвращает слайс, потому что операция добавления элементов может привести к реаллокации базового массива, если текущая capacity недостаточна.
Поэтому если бы append не возвращал слайс, а модифицировал исходный, мы бы потеряли ссылку на новый массив после реаллокации.
Даже если реаллокация не произошла и базовый массив остался тем же, возвращаемый слайс будет иметь обновленную длину.
🐸Библиотека Go для собесаЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩💻-СОБЕС
В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним.
Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему.
Регулярно проверяйте свои hard-skills.
Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов!
P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать!
Помни, что каждое собеседование в 2026 на вес золота!
❓ Как можно получить дедлок при работе с горутинами
Deadlock возникает, когда все горутины заблокированы и ждут друг-друга, из-за чего программа не может продолжить выполнение. Рантайм обнаруживает это и завершает программу с ошибкой fatal error: all goroutines are asleep - deadlock!.
Типичные причины дедлоков: отправка в небуферизованный канал без получателя, чтение из канала без отправителя, циклическое ожидание на мьютексах, ожидание на WaitGroup, которая никогда не завершится.
Примеры:
// Пример 1: отправка без получателя
ch := make(chan int)
ch <- 1 // deadlock - никто не читает
// Пример 2: чтение без отправителя
ch := make(chan int)
<-ch // deadlock - никто не пишет
// Пример 3: взаимная блокировка
var mu1, mu2 sync.Mutex
go func() {
mu1.Lock()
mu2.Lock() // ждет mu2
}()
mu2.Lock()
mu1.Lock() // ждет mu1
Используйте select с default или таймауты для предотвращения.
🐸Библиотека Go для собеса❓ Что происходит при склеивании строк
Строки в Go неизменяемы. При использовании оператора «+» для конкатенации каждый раз создается новая строка в памяти. Это приводит к избыточным аллокациям и падению производительности при частых операциях склеивания.
Для построения строк используйте strings.Builder — он накапливает данные во внутреннем буфере и минимизирует выделение памяти.
Пример с strings.Builder:
var builder strings.Builder
for i := 0; i < 1000; i++ {
builder.WriteString("x")
}
result := builder.String()
🐸Библиотека Go для собеса❓ Как вам вопросы прошедшей недели
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
🐸 Библиотека Go для собеса
❓ Какие основные сущности в планировщике в Go
Планировщик Go реализует модель M:N, где M горутин выполняются на N потоках ОС.
В его основе лежат три ключевые сущности:
G (Goroutines) — это потоки выполнения, основные единицы конкурентности в Go. Они значительно легче потоков ОС и могут создаваться тысячами.
M (Machines) — это потоки операционной системы, которые непосредственно исполняют код на физических ядрах процессора. Они выполняют горутины.
P (Processors) — логические процессоры, которые служат связующим звеном между G и M. Каждый P имеет локальную очередь готовых к выполнению горутин и управляет их распределением. Количество P обычно равно числу доступных ядер CPU.
Горутины хранятся в очередях выполнения— есть локальные очереди у каждого P и одна глобальная.
🎁 Новогодняя акция: 3 курса по цене 1
🤝 Помощь с выбором курса
🐸Библиотека Go для собеса
«Этот манёвр будет стоить нам 51 год...»
На собеседованиях по
Go всё чаще спрашивают не только про горутины и каналы, но и про фундаментальные алгоритмы и архитектуру высоконагруженных систем. Не ждите, пока пробелы в знаниях станут критическими.
В Proglib Academy поднимаются цены. У вас есть шанс зайти на обучение по старой стоимости:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Забрать базу для собеседований
⚠️ Цены вырастут уже 19 января
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
