Библиотека Go для собеса | вопросы с собеседований
6.91K subscribers
247 photos
10 videos
1 file
561 links
Вопросы с собеседований по Go и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/0b524a15

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.iss.one/proglibrary/9197
Download Telegram
В чем состоит идея паттерна fan-in

Fan-in — это паттерн обратный fan-out, когда результаты множества параллельных горутин собираются в один канал или поток для дальнейшей обработки.

Реализация паттерна в Go часто использует каналы и sync.WaitGroup: каждая горутина пишет свои результаты в общий канал, а после завершения всех горутин канал закрывается основной горутиной.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Как вам вопросы прошедшей недели

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуется фидбек в комментах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥10👍3
В чем ключевые моменты организации сбора и агрегации ошибок от горутин в fan-in реализации

Ошибки нужно передавать через отдельный канал или включать в структуру результата. В Go есть пакет errgroup, который объединяет синхронизацию горутин и агрегирует ошибки.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Какие метрики важно мониторить при использовании fan-in и fan-out

• Количество активных горутин.
• Задержки в обработке (latency).
• Время выполнения горутин.
• Использование CPU и памяти.
• Ошибки и тайм-ауты.
• Очередь ожидания в каналах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
Media is too big
VIEW IN TELEGRAM
🔥 Закрой пробелы в математике за 8 недель

Валишься на вопросах про математику на собесах?

Proglib Academy запускает курс «Математика для Data Science», чтобы помочь тебе получить вакансию мечты!

🔎 Тебя ждут:

→ топовые эксперты, один из них на видео — Мария Тихонова. Мария — кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ;
→ живые вебинары, на которых можно задать вопросы спикерам;
→ доступ к материалам в записи, если не успели на лекцию и чат;
→ 3 задания с практикой на Python и финальный проект с подробной обратной связью от экспертов курса;
→ актуальные знания: программа разработана в ноябре 2025г;
→ программа без воды — 2 месяца только самого нужного для старта.

👉 Пройди короткий тест и узнай свой уровень математики.

Приятные бонусы:

🎁 скидка 40% до 30 ноября;
🎁 оплати до конца ноября → курс «Школьная математика» в подарок.

🔗 Подробнее о курсе
Почему append на nil-срезе работает, а добавление в nil-мапу ломается

В Go срезы и мапы ведут себя по-разному, когда не инициализированы:

nil-срез — это жизнеспособный срез с длиной и ёмкостью равными нулю. Когда используется append к nil-срезу, Go автоматически выделяет новую память и создаёт срез нужного размера. Поэтому добавлять элементы в nil-срез можно без проблем.

var a []int
a = append(a, 4, 5, 6) // Go создал новый срез под эти значения
fmt.Println(a) // [4 5 6]


nil-мапа — это просто пустой указатель без выделенной памяти. Если попытаться добавить ключ в такую мапу, Go выдаст панику, потому что для хранения данных места нет. Чтобы использовать мапу, её надо сначала инициализировать через make.

var m map[int]int
// m[1] = 1 // вызовет панику
m = make(map[int]int)
m[1] = 1 // теперь работает


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
8🎉1
Почему nil-срез и пустой срез через []int{} — разные значения, но ведут себя одинаково

Оба имеют длину 0 и ёмкость 0. Но nil-срез — это буквально nil, а []int{} — это выделенная память нулевого размера.

var nilSlice []int
emptySlice := []int{}

fmt.Println(nilSlice == nil) // true
fmt.Println(emptySlice == nil) // false

// Но в большинстве операций ведут себя одинаково
for range nilSlice { }
for range emptySlice { }

s := append(nilSlice, 1) // работает
s = append(emptySlice, 1) // работает


Различие заметно только при прямом сравнении с nil. В остальном — функционально эквивалентны.

🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
В чем разница между context.Background() и context.TODO()

context.Background() — это корневой контекст для вашего приложения. Используйте его как точку отсчета в главной функции или верхнем уровне обработки запросов. Это полностью независимый контекст без родителя:
func main() {
ctx := context.Background()
// начало всей программы
}


context.TODO() — заглушка для тех случаев, когда вы еще не определились, какой контекст передавать. Это временное решение: код работает, но вы планируете заменить его на правильный контекст, когда уточните требования:
func processData() {
ctx := context.TODO() // TODO: заменить на нужный контекст
// временный вариант
}


Оба создают не имеющий родителя контекст, но семантически они разные.

🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
Какой подход использовать, если нужно модифицировать данные так, чтобы другие срезы не видели изменений

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

Пример:
func modifyLocal(s []int) []int {
copySlice := make([]int, len(s))
copy(copySlice, s)
// изменения только в copySlice
copySlice[0] = 100
return copySlice
}


🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉1
Как регулируется сборка мусора в Go

В Go управление запуском сборщика мусора задаётся параметром GOGC. Этот параметр определяет, насколько увеличится используемая память с момента последней очистки, прежде чем запустится следующий процесс сборки мусора.

Что означают разные значения GOGC:

• Значение по умолчанию — 100 — запускает сборку, когда память удваивается по сравнению с после-очисточным состоянием.

• Если поставить 0, автосборка мусора отключается полностью.

• Числа меньше 100 заставляют сборщик работать чаще, сокращая использование памяти, но увеличивая нагрузку на процессор.

• Значения больше 100 — запускают сборку реже, что снижает нагрузку CPU, но увеличивает объём занятой памяти.

🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Как вам вопросы прошедшей недели

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуется фидбек в комментах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥192🥱2👍1
В чём разница между sync.Pool и ручной реализацией object pool через chan или []T + sync.Mutex

sync.Pool ничего не гарантирует: объект, который положили в пул, может быть в любой момент выкинут GC и никогда не вернуться из Get. Это «лучше есть, чем хранить», а не кэш с гарантией.

Пул на chan или []T+Mutex ведёт себя как обычная очередь/стек: пока вы сами не выбросите объект, он будет там лежать и обязательно вернётся, если его взять.

🔹 Экспресс-курс «Математика для Data Science»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3
В каких случаях применение sync.Pool будет неэффективным или даже вредным для производительности

Когда sync.Pool не нужен

Объекты создаются редко или их создание дешёвое: накладные расходы на Get/Put и внутреннюю механику пула могут оказаться дороже, чем простая новая аллокация.

Объектов мало и они живут долго: в этом случае они и так нормально переживаются в heap, а пул только усложняет код и увеличивает удерживаемый объём памяти.

Когда sync.Pool вредит производительности:

Высокая конкуренция, но мало реюза: если горутин много, а «хитов» по пулу мало, вы платите за синхронизацию и усложнение GC, почти не снижая количество аллокаций.

Объекты большие: удерживание крупных структур в пуле раздувает память и увеличивает нагрузку на GC, иногда сильнее, чем выгода от экономии аллокаций.

🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🎄 С Нового года начну учиться — знакомо?

А потом январь — освоюсь после праздников, февраль — доделаю текущие дела... Не откладывай на следующий год то, что можно начать уже в этом.

🗓️ 4 декабря стартует экспресс-курс «Математика для Data Science»— всё, что нужно для уверенных ответов на собесах:

→ 2 месяца без воды;
→ обновлённая программа (ноябрь 2025);
→ живые вебинары с экспертами;
→ записи всех занятий;
→ практика на Python + финальный проект с фидбэком.

Формат: 2 месяца интенсива и к началу следующего года ты готов к собесам.

Пока другие будут собираться с мыслями после НГ, ты уже будешь на полпути к офферу мечты.

🎁 Только до 30 ноября:

→ скидка 40% на курс;
→ курс «Базовая математика» в подарок;
→ бесплатный тест уровня математики.

👉🏻 Хочешь на курс → пиши менеджеру
🤔1
Расскажите про поля и методы sync.Pool. Для чего используется поле New, как ведёт себя Get, если пул пуст

Поле New — это функция func() any, которую можно задать, чтобы пул умел сам создавать новые объекты, когда внутри ничего нет.

Если New не задано и пул пуст, то Get вернёт nil, и код, который этим пользуется, обязан это корректно обработать.


🔹 AI-агенты для DS-специалистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🎉1
Что произойдёт, если класть в один и тот же sync.Pool объекты разных типов

Пул примет значения разных типов: Put не проверяет тип, а Get вернёт any, который вы потом приведёте к конкретному типу через type assertion.

Если из пула вернётся объект не того типа, type assertion даст panic в рантайме, причём воспроизвести и отладить это будет сложно из‑за конкуренции и недетерминизма.

🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4