Библиотека Go для собеса | вопросы с собеседований
رفتن به کانال در Telegram
Вопросы с собеседований по Go и ответы на них. Покажем, как запустить своего ии-агента: https://clc.to/tvpmD По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
نمایش بیشتر7 431
مشترکین
-224 ساعت
-127 روز
+930 روز
آرشیو پست ها
❓ Как в Go организован доступ к системным вызовам операционной системы
В Go можно напрямую обращаться к системным вызовам ОС. Для этого существует пакет
syscall из стандартной библиотеки, а также более современный пакет golang.org/x/sys/unix или windows. Они предоставляют низкоуровневый интерфейс к вызовам ядра — например, можно вызвать syscall.Open, syscall.Read, syscall.Write или напрямую использовать syscall.Syscall(SYS_READ, ...), передавая номер системного вызова и аргументы.
На практике прямое использование syscall встречается редко, потому что стандартная библиотека Go уже абстрагирует большинство системных взаимодействий через пакеты os, net, io и другие. Под капотом именно они и вызывают соответствующие syscall'ы. Прямой доступ обычно нужен в специфичных сценариях — например, при работе с epoll, ptrace, seccomp, установке флагов дескрипторов или при написании системных утилит, где нужна максимальная гибкость без лишних обёрток.
🐸 Библиотека Go для собеса❓ Как поддерживать старый и новый функционал одновременно
Паттерн Strangler Fig позволяет постепенно заменять старую систему новой, не останавливая работу продукта. Новый функционал «обволакивает» старый как фикус обволакивает дерево-хозяина и со временем полностью его вытесняет.
Можно реализовать через фасадную-прослойку: она перехватывает запросы и решает куда направить вызов: в legacy-код или в новый сервис.
Переключение идёт через фича флаги, фича за фичей, пока старый код не становится ненужным и его можно удалить.
🐸Библиотека Go для собеса
❓ У вас уже спрашивали что-то про ИИ на собесах
❓ Какой максимальный размер бинарного файла можно собрать
В Go нет встроенного ограничения на размер бинарника. Теоретический предел это ресурсы машины, на которой идёт компиляция: свободное место на диске и доступная память.
Размер бинарника растёт из-за нескольких вещей:
Статическая линковка. Go по умолчанию собирает всё в один файл — рантайм, стандартная библиотека, все зависимости. Никаких внешних
.so или .dll. Это удобно при деплое, но увеличивает размер даже у простой программы.
Встроенные ресурсы. Через //go:embed можно упаковать в бинарник статику, шаблоны, миграции. Добавили папку с фронтендом — бинарник вырос на её размер.
Отладочная информация. По умолчанию Go включает в бинарник DWARF-символы и таблицы имён. Это нужно для профилировщика и стектрейсов, но добавляет вес.
Если размер важен, его можно уменьшить флагами линковщика:
go build -ldflags="-s -w" -o app .
-s убирает таблицу символов, -w отключает DWARF. Бинарник становится меньше на 20–30%, но отладка по нему будет затруднена.
Дополнительно можно прогнать через upx — утилита сжимает исполняемый файл, он распаковывается уже в памяти при запуске.
🐸Библиотека Go для собеса❓ Чем отличаются require, replace и exclude в go.mod
require фиксирует модуль и его версию. Без этой записи Go не знает, что подключать. При запуске go mod tidy строки require обновляются автоматически.
require github.com/some/pkg v1.2.3
replace подменяет источник модуля. Можно указать форк, другую версию или локальный путь. Чаще всего используют при локальной разработке — когда нужно протестировать изменения в зависимости, не публикуя их.
replace github.com/some/pkg => ../local/pkg
exclude запрещает использовать конкретную версию при разрешении зависимостей. Модуль не удаляется, но если что-то в дереве зависимостей попытается подтянуть именно эту версию — Go её проигнорирует и выберет другую. Применяют, когда версия содержит баг или уязвимость.
exclude github.com/some/pkg v1.2.3🐸Библиотека Go для собеса
❓ Какая сложность по времени у доступа к элементам слайса
Go обращается по индексу к соответствующему элементу в массиве, на который ссылается слайс.
Доступ к элементу слайса константный по времени О(1).
🐸Библиотека Go для собеса
❓ Чем отличается
%v от %#v в fmt.Printf
%v — выводит значение в формате по умолчанию.
%#v — выводит значение в Go-синтаксисе. Представление, которое можно вставить в код как литерал.
type User struct {
Name string
Age int
}
u := User{"Alice", 30}
fmt.Printf("%v\n", u) // {Alice 30}
fmt.Printf("%#v\n", u) // main.User{Name:"Alice", Age:30}
🐸Библиотека Go для собеса❓ Насколько безопасно передавать слайсы в горутины
Если несколько горутин читают и пишут в один слайс одновременно — это гонка данных, даже если они обращаются к разным индексам.
append может вызвать реаллокацию: старый массив заменяется новым, и другие горутины продолжат работать с устаревшим указателем
Передача слайса по значению копирует только заголовок , но не данные — горутины всё равно разделяют память
Что делать:
•
sync.Mutex / sync.RWMutex — если нужен общий доступ с защитой
• передавать копию данных через канал, если горутина должна работать независимо
• sync.Map или разбиение на независимые диапазоны, если горутины работают с непересекающимися частями
Важный нюанс: если горутины работают со строго непересекающимися индексами и append не вызывается — гонки нет. Но доказать это на ревью сложно, поэтому явная синхронизация предпочтительнее.
🐸Библиотека Go для собеса❓ Как можно сделать разреженный массив
Вместо того чтобы перечислять значения, достаточно указать только значимые позиции.
Нужно в литерале массив указать индекс элемента явно через
индекс: значение. Все значения, что не будут указаны заполнятся дефолтными значениями.
Пример:
var x = [12]int{1, 5: 4, 6, 10: 100, 15}
🐸Библиотека Go для собеса❓ Зачем нужен Makefile
Makefile это файл с описанием целей сборки, который запускается утилитой make.
В Go-проектах он используется для автоматизации повторяющихся операций: форматирования, линтинга, статического анализа и компиляции.
Вместо того чтобы каждый раз вручную запускать
go fmt, go vet и go build, достаточно одной команды make и все шаги выполнятся в нужном порядке.
🐸Библиотека Go для собеса❓ Почему в Go невозможно поставить открывающую фигурную скобку на новой строке? Это ограничение компилятора, линтера или что-то более фундаментальное
Это фундаментальное требование грамматики языка, обусловленное работой лексера.
В Go лексер автоматически вставляет точку с запятой в конец строки, если последний токен перед переносом строки является:
• идентификатор:
foo, x, myVar
• литерал: 42, "hello", true
• break, continue, fallthrough, return, ++, --, ), ], }
Это означает, что код вида:
func foo()
{
}
лексер преобразует в:
func foo(); // ← `;` вставлена после `)`
{
}
🐸Библиотека Go для собесаОсталось всего 4 места на курс по ИИ-агентам. 30 апреля закрываем набор окончательно.
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
🏃♀️ Записаться, пока есть места
❓ Когда случается коллизия у хэш-функции
Коллизия возникает, когда два разных ключа дают одинаковый хэш. Это не баг конкретной реализации, любая хэш-функция с ограниченным выходным пространством теоретически может выдать одинаковый результат для разных входных данных.
Коллизии сами по себе не ломают мапу, она продолжает работать корректно. Но если коллизий становится много, поиск деградирует от O(1) до O(n), потому что вместо прямого доступа начинается перебор.
🐸Библиотека Go для собеса
🏃♀️ Как провести вечер вторника с пользой для карьеры?
Включайте кружок там личное приглашение от спикера. 👆
Уже завтра в прямом эфире, разбираем архитектуру контекста в мультиагентных системах.
🤫 Секретный лут:
промик на 5.000₽. Он достанется только тем, кто придет на прямой эфир.
👉 Регистрируйтесь на трансляцию
❓ Где и когда уместно применять синглтон в Go
✅ Пул соединений с базой данных
Создание нового соединения это дорогостоящая операция. Синглтон гарантирует, что во всём приложении используется один общий пул соединений
(*sql.DB), что снижает накладные расходы и предотвращает исчерпание лимитов на стороне базы данных.
✅ Менеджер конфигурации
Параметры приложения: файл конфигурации, переменные окружения. Они читаются один раз при старте. Синглтон даёт удобный единый доступ к этим данным из любой части программы без повторного чтения и парсинга.
✅ Логгер
Глобальный логгер: он должен быть один, настроен единожды (уровень логирования, вывод, формат) и доступен из любого пакета. В Go это часто реализуется через log/slog или сторонние библиотеки вроде zap.
✅ Кэш в памяти
Если приложению нужен разделяемый кэш (например, результаты тяжёлых вычислений или ответы внешних API), синглтон обеспечивает единое хранилище для всех горутин. Важно сочетать его с sync.RWMutex или использовать sync.Map для безопасного доступа.
🐸Библиотека Go для собеса❓ Чем OnceValue лучше глобальной переменной с init()
init() запускается при старте программы, даже если значение никогда не понадобится.
OnceValue — ленивая инициализация: вычисление происходит только при первом вызове. Это полезно для тяжёлых операций (соединения с БД, чтение файлов) и упрощает тестирование.
🐸Библиотека Go для собеса❓ Какие проблемы могут возникнуть при использовании синглтона в многозадачных приложениях
- Проблемы с потокобезопасностью
Если синглтон не был правильно реализован с учётом многозадачности, могут возникнуть гонки данных, когда несколько горутин одновременно пытаются создать или получить доступ к экземпляру синглтона.
- Проблемы с масштабируемостью
Если приложение становится более сложным и распределённым, синглтон может стать ограничением для масштабируемости. В распределённых системах или микросервисах использование синглтонов может привести к проблемам с состоянием и затруднить масштабирование приложения.
- Проблемы с производительностью
Синглтон может стать узким местом в многозадачных приложениях, особенно если доступ к нему синхронизирован с использованием блокировок, таких как мьютексы. Если горутины часто обращаются к синглтону и блокируют его, это может существенно снизить производительность программы.
- Проблемы с инициализацией синглтона
Если синглтон требует сложной инициализации, например, создание нескольких объектов, настройка зависимостей, это может замедлить работу приложения, особенно если инициализация не оптимизирована.
🐸Библиотека Go для собеса
❓ Какие преимущества даёт синглтон в Go
+ Единая точка доступа к ресурсу
Синглтон гарантирует, что во всём приложении существует только один экземпляр объекта — например, пул соединений к базе данных или менеджер конфигурации. Это исключает дублирование ресурсов и случайное создание конкурирующих экземпляров.
+ Ленивая инициализация через sync.Once
В Go синглтон удобно реализуется через sync.Once: объект создаётся только при первом обращении. Это экономит память и время запуска, если ресурс вообще не понадобится в ходе работы программы.
+ Глобальное состояние без глобальных переменных
Синглтон позволяет инкапсулировать общее состояние внутри структуры с методами, избегая «голых» глобальных переменных. Это улучшает читаемость кода и упрощает контроль за изменениями состояния.
+ Потокобезопасная инициализация из коробки
При использовании sync.Once Go гарантирует, что функция инициализации будет вызвана ровно один раз, даже если несколько горутин обратятся к синглтону одновременно. Разработчику не нужно писать дополнительную логику блокировок.
🐸Библиотека Go для собеса
⚡️Ваш сервис проходит тесты, но падает под нагрузкой? Проблема чаще не в коде, а в том, как вы тестируете систему. Набор изолированных проверок не показывает, что происходит в реальных сценариях — когда сервисы начинают работать вместе.
📅На открытом уроке разберём, как выстроить тестирование микросервисов на Go так, чтобы оно отражало реальную нагрузку. Покажем, как проверять API, базу данных и брокеры сообщений в связке, чем отличается E2E-тест от интеграционного, и как проводить нагрузочное тестирование — от одного сервиса до цепочки вызовов. Отдельно разберём, как тегирование трафика через Service Mesh помогает выявлять проблемы, которые невозможно увидеть в обычных тестах.
💡Открытый урок проходит в преддверии старта курса «Микросервисы на Go» 7 мая в 20:00 МСК.
Принять участие: https://clc.to/ct7wUA
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
