Библиотека Go для собеса | вопросы с собеседований
Відкрити в Telegram
Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Показати більше7 428
Підписники
-524 години
-77 днів
+630 день
Архів дописів
❓ Какой подход использовать, если нужно модифицировать данные так, чтобы другие срезы не видели изменений
Нужно сделать новый срез с нужной длиной и емкостью, затем скопировать в него данные из исходного среза через
copy. После этого изменения будут вноситься только в копию, и исходный срез и другие срезы на те же данные останутся без изменений.
Пример:
func modifyLocal(s []int) []int {
copySlice := make([]int, len(s))
copy(copySlice, s)
// изменения только в copySlice
copySlice[0] = 100
return copySlice
}
🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека Go для собеса❓ В чем разница между context.Background() и context.TODO()
context.Background() — это корневой контекст для вашего приложения. Используйте его как точку отсчета в главной функции или верхнем уровне обработки запросов. Это полностью независимый контекст без родителя:
func main() {
ctx := context.Background()
// начало всей программы
}
context.TODO() — заглушка для тех случаев, когда вы еще не определились, какой контекст передавать. Это временное решение: код работает, но вы планируете заменить его на правильный контекст, когда уточните требования:
func processData() {
ctx := context.TODO() // TODO: заменить на нужный контекст
// временный вариант
}
Оба создают не имеющий родителя контекст, но семантически они разные.
🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека Go для собеса❓ Почему 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 для собеса❓ Почему 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 для собеса🔥 Закрой пробелы в математике за 8 недель
Валишься на вопросах про математику на собесах?
Proglib Academy запускает курс «Математика для Data Science», чтобы помочь тебе получить вакансию мечты!
🔎 Тебя ждут:
→ топовые эксперты, один из них на видео — Мария Тихонова. Мария — кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ;
→ живые вебинары, на которых можно задать вопросы спикерам;
→ доступ к материалам в записи, если не успели на лекцию и чат;
→ 3 задания с практикой на Python и финальный проект с подробной обратной связью от экспертов курса;
→ актуальные знания: программа разработана в ноябре 2025г;
→ программа без воды — 2 месяца только самого нужного для старта.
👉 Пройди короткий тест и узнай свой уровень математики.
Приятные бонусы:
🎁 скидка 40% до 30 ноября;
🎁 оплати до конца ноября → курс «Школьная математика» в подарок.
🔗 Подробнее о курсе
❓ Какие метрики важно мониторить при использовании fan-in и fan-out
• Количество активных горутин.
• Задержки в обработке (latency).
• Время выполнения горутин.
• Использование CPU и памяти.
• Ошибки и тайм-ауты.
• Очередь ожидания в каналах.
🐸 Библиотека Go для собеса
❓ В чем ключевые моменты организации сбора и агрегации ошибок от горутин в fan-in реализации
Ошибки нужно передавать через отдельный канал или включать в структуру результата. В Go есть пакет
errgroup, который объединяет синхронизацию горутин и агрегирует ошибки.
🐸 Библиотека Go для собеса❓ Как вам вопросы прошедшей недели
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
🐸 Библиотека Go для собеса
❓ В чем состоит идея паттерна fan-in
Fan-in — это паттерн обратный fan-out, когда результаты множества параллельных горутин собираются в один канал или поток для дальнейшей обработки.
Реализация паттерна в Go часто использует каналы и sync.WaitGroup: каждая горутина пишет свои результаты в общий канал, а после завершения всех горутин канал закрывается основной горутиной.
🐸 Библиотека Go для собеса
❓ Что такое паттерн fan-out
Fan-out — это паттерн, при котором поток генерирует несколько горутин, чтобы повысить производительность и использовать многопоточность.
Например, вместо того чтобы обрабатывать 100 запросов последовательно, мы распараллеливаем их и обрабатываем одновременно, что уменьшает общую задержку выполнения.
🐸 Библиотека Go для собеса
❓ Влияет ли использование алиасов на производительность программы
Нет, алиасы не влияют на производительность, так как они не создают новых типов и не меняют структуру данных.
🐸 Библиотека Go для собеса
🧑💻 Все еще пишешь типовой код вручную?
Есть способ лучше. Кодогенерация в Go — это мощный инструмент, который автоматизирует рутину и расширяет возможности языка.
На открытом уроке «Кодогенерация в Go: код, который не пришлось писать» разберем, как это работает. Поговорим о том, когда кодогенерация уместна, какие механизмы Go ее позволяют и как это применяется в реальных проектах.
❗Это тот случай, когда нейросети не заменят глубокого понимания механизмов языка. Практикующий разработчик с опытом в продакшене покажет, как избежать подводных камней и применять кодогенерацию в рабочих проектах. Ваш шанс научиться создавать более эффективные и лаконичные решения. Перестаньте тратить время на шаблонные задачи и начните генерировать код, который работает за вас.
🗓 Урок пройдет 19 ноября в 20:00 в преддверии старта курса «Golang Developer. Professional». Все участники вебинара получат скидку на обучение. Регистрируйтесь по ссылке, чтобы освоить один из самых перспективных навыков в Go: https://clc.to/pXNfCw
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❓ Возможно ли использовать алиасы для встроенных типов, таких как int, string
Да, алиасы можно создавать для любых типов, включая встроенные). Это делают для улучшения читаемости кода или для придания типам семантического смысла, например, type UserID = int.
🐸 Библиотека Go для собеса
❓ Можно ли присвоить значение типа-алиаса значению оригинального типа
Да, можно. Алиас в Go — это другое имя для того же типа, а не новый тип. Поэтому значения типа-алиаса и оригинального типа полностью совместимы и могут присваиваться друг другу без приведения.
🐸 Библиотека Go для собеса
❓ Как использовать алиасы и какие кейсы использования знаете
Алиасы создаются с помощью ключевого слова type и позволяют дать новое имя уже существующему типу. Они не создают новый тип, а лишь создают альтернативное имя для существующего типа.
Основные кейсы использования алиасов:
• Если имя пакета или типа слишком длинное, алиас позволяет использовать сокращённое имя для удобства и читаемости
• При импорте двух пакетов с одинаковыми именами, алиасы используются для различия
import (
sqlDB "project/sql/db"
nosqlDB "project/nosql/db"
)
• Если в новой версии библиотеки типы были переименованы или перемещены, алиасы позволяют сохранить старые имена без изменения основного кода.
🐸 Библиотека Go для собеса❓ Как вам вопросы прошедшей недели
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
🐸 Библиотека Go для собеса
🌐 HTTP уже не тянет? В микросервисной архитектуре запросы множатся, скорость падает, а код превращается в клубок зависимостей. Настало время познакомиться с инструментом, который решает эти проблемы изящно — gRPC.
📗 На открытом уроке вы разберёте, как работает этот фреймворк, почему он вытесняет REST и как описывать API с помощью Protobuf. Вы узнаете, как обеспечить обратную совместимость между сервисами, повысить производительность и упростить взаимодействие микросервисов.
❗️После вебинара вы сможете строить быстрые и надёжные коммуникации между сервисами на Go — с чистой архитектурой и минимумом боли.
➡️ 12 ноября в 20:00 МСК. Открытый вебинар проходит в преддверии старта курса «Golang Developer. Professional». Регистрируйтесь и узнайте, почему gRPC становится стандартом нового поколения для Go-разработчиков: https://clc.to/qOyH8Q
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❓ От чего зависит размерность int
Go автоматически выбирает размерность в зависимости от платформы, на которой компилируется программа. Если нужен строго определённый размер, используйте явные типы: int32, int64, uint32, uint64.
🐸 Библиотека Go для собеса
❓ За что отвечает второй аргумент в make при создании мапы
Это подсказка на желаемое количество элементов.
myMap := make(map[string]int, 3)
Второй параметр говорит Go, сколько элементов вы планируете хранить. Это не резервирует точное количество памяти и не ограничивает мапу. Go использует эту подсказку для предварительного выделения бакетов, чтобы избежать лишних переалокаций на начальном этапе.
🐸 Библиотека Go для собеса❓ Какое максимальное значение элементов в бакете у мапы
Максимума нет — бакет может расти бесконечно. Каждый бакет состоит из восьми слотов, но если в одном бакете происходит коллизия, элементы образуют цепочку. Эта цепочка может расти сколько угодно. Однако когда общий load factor превышает лимит, вся мапа переалоцируется, чтобы уменьшить количество коллизий.
🐸 Библиотека Go для собеса
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
