Библиотека 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
Как использовать алиасы и какие кейсы использования знаете

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

Основные кейсы использования алиасов:

• Если имя пакета или типа слишком длинное, алиас позволяет использовать сокращённое имя для удобства и читаемости

• При импорте двух пакетов с одинаковыми именами, алиасы используются для различия
import (
sqlDB "project/sql/db"
nosqlDB "project/nosql/db"
)


• Если в новой версии библиотеки типы были переименованы или перемещены, алиасы позволяют сохранить старые имена без изменения основного кода.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
Можно ли присвоить значение типа-алиаса значению оригинального типа

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
Возможно ли использовать алиасы для встроенных типов, таких как int, string

Да, алиасы можно создавать для любых типов, включая встроенные). Это делают для улучшения читаемости кода или для придания типам семантического смысла, например, type UserID = int.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉1
Влияет ли использование алиасов на производительность программы

Нет, алиасы не влияют на производительность, так как они не создают новых типов и не меняют структуру данных.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3😁1
Что такое паттерн fan-out

Fan-out — это паттерн, при котором поток генерирует несколько горутин, чтобы повысить производительность и использовать многопоточность.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤‍🔥2💯2
В чем состоит идея паттерна 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