Библиотека Go для собеса | вопросы с собеседований
6.88K subscribers
220 photos
6 videos
1 file
424 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
💬 Что из себя представляет Pub/Sub модель обмена сообщениями?

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

🔹 Издатели отправляют сообщения в определённые каналы или темы, управляемые брокером. Они не имеют информации о подписчиках и их количестве, что позволяет легко добавлять новые источники данных без изменения общей системы.

🔹 Подписчики регистрируются для получения сообщений из одной или нескольких тем. Они получают сообщения автоматически от брокера, когда издатели отправляют данные в те темы, на которые они подписаны. Это позволяет им реагировать на новые данные в реальном времени.

🔹 Брокер действует как посредник между издателями и подписчиками, управляя подписками и обеспечивая доставку сообщений к подписчикам. Брокер обеспечивает децентрализацию, масштабируемость и устойчивость системы, отвечая за буферизацию сообщений, управление трафиком и обработку ошибок.
9
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных»

🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4

На вводной части вас ждут:

1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов

2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ

3. Практические задания после лекций

4. Ссылки на дополнительные материалы для самостоятельного изучения

⚡️Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3🥱2
💬 Чем отличается hard link от symbolic link в Linux? Что будет с файлом, если удалить hard link или symlink?

🔹 Жёсткая ссылка — это дополнительное имя для существующего файла на диске. Она указывает на те же самые блоки данных на диске, что и оригинальный файл, и имеет тот же номер inode.
🔹 Жёсткая ссылка фактически не отличается от оригинального файла. Изменения, сделанные через жёсткую ссылку, будут отражаться в оригинальном файле, так как они оба указывают на одни и те же данные.
🔹 Удаление жёсткой ссылки не приводит к удалению данных файла, пока существует хотя бы одна ссылка (имя файла) указывающая на эти данные. Файл будет физически удалён с диска только тогда, когда последняя жёсткая ссылка на него будет удалена.

🔸 Символическая ссылка — это отдельный файл, который содержит путь к другому файлу или другой директории. В отличие от жёсткой ссылки, она имеет свой собственный inode и блоки данных, которые хранят этот путь.
🔸 Если оригинальный файл, на который указывает символическая ссылка, будет перемещён или удалён, ссылка «сломается» и больше не сможет обеспечить доступ к файлу, потому что она указывает на конкретный путь.
🔸 Удаление символической ссылки не оказывает никакого влияния на оригинальный файл. Символическая ссылка просто перестаёт существовать, а оригинальный файл остаётся на месте, т. к. ссылка на сам файл и его данные не затрагиваются.
👍192
🏃 🏃 Самоучитель по Go для начинающих. Часть 11. Обработка ошибок. Паника. Восстановление. Логирование

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

👉 Читать гайд

📌 Остальные части в серии:

1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
👍5
💬 Как работает WithCancel из пакета context в Go?

Функция WithCancel из пакета context в Go позволяет создать новый контекст, который можно отменить, на основе существующего родительского контекста. Она возвращает производный контекст (`ctx`) и функцию отмены (`cancel`), которая может быть вызвана для отмены этого контекста.

Пример использования:
ctx, cancel := context.WithCancel(parentCtx)

Здесь ctx является новым контекстом, который наследует все характеристики и значения из parentCtx. cancel — это функция, вызов которой отменяет ctx и все связанные с ним дочерние контексты, если таковые имеются.

При вызове cancel():

🔹 Канал Done() для контекста ctx будет закрыт. Это сигнализирует всем потребителям контекста, что операции должны быть прекращены как можно скорее.
🔹 Все горутины или операции, которые «слушают» канал Done() контекста, могут реагировать на его закрытие, чтобы корректно остановить свою работу и освободить ресурсы.
6🔥4👍2
💬 Для чего предназначена директория internal в Go-проекте?

Директория internal в структуре Go-проекта используется для ограничения доступности кода. Код, помещенный в эту директорию, может быть импортирован и использован только внутри того же Go-модуля. Это предотвращает доступ к внутреннему коду из других модулей, что позволяет скрыть реализацию деталей, которые не предназначены для общедоступного API. Такой подход помогает управлять зависимостями в больших проектах.

Это особенно полезно в крупных проектах и при разработке библиотек, когда нужно чётко разграничить внутреннюю логику от API, который предоставляется пользователям. Директория internal гарантирует, что внутренние компоненты не будут случайно использованы в других частях программы или в сторонних проектах, что способствует безопасности и стабильности кода.
11👍4
💬 Какие особенности необходимо учитывать при встраивании типов в Go?

В Go поле структуры называется встроенным, если оно объявлено без имени. Например,


type Foo struct {
Bar // Встроенное поле
}

type Bar struct {
Baz int
}


В структуре Foo тип Bar объявлен без связанного с ним имени; следовательно, это встроенное поле.

Поскольку Bar содержит поле Baz, это поле «продвигается» в Foo. Таким образом, Baz становится доступным из Foo.

📌 Основные особенности, которые необходимо учитывать:

1. Встраивание типов не должно использоваться только как синтаксический сахар для упрощения доступа к полю (например, Foo.Baz() вместо Foo.Bar.Baz()).
2. Встраивание типов не должно «продвигать» данные (поля) или поведение (методы), которые мы хотим скрыть от внешнего мира: например, если это позволяет клиентам получить доступ к поведению блокировки, которое должно оставаться приватным для структуры.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Можно ли утверждать, что после уменьшения размера среза в Go память, занимаемая оставшимися элементами, будет освобождена?

Срез состоит из трех компонентов: указателя на начало среза в массиве, длины среза и его емкости. Емкость среза указывает на максимальное количество элементов, которое срез может вместить, не требуя перераспределения памяти.

Когда мы уменьшаем размер среза, (например, s[:n], где n меньше текущей длины среза s), мы изменяем только длину среза, но не его емкость. Память, связанная с емкостью среза, остается выделенной, поскольку базовый массив, к которому срез имеет доступ, остается неизменным.

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

Таким образом, GC очистит память старого массива (если на него не будут указывать другие срезы) только после реалокации памяти и переноса значений в новый срез.
4👍1
💬 Что такое procfs и sysfs в контексте ОС Linux?

🔹 procfs, или файловая система proc, является важным компонентом для мониторинга и управления процессами в ОС Linux. Она предоставляет динамический интерфейс к структурам данных ядра. Каждый запущенный процесс в системе представлен директорией в /proc с соответствующим PID как именем этой директории.

Внутри каждой такой директории можно найти файлы и ссылки, предоставляющие информацию о состоянии процесса и позволяющие в некоторых случаях изменять параметры работы процесса. Например, файл /proc/[pid]/status содержит информацию о состоянии процесса, его памяти, приоритете и другие важные данные.

🔹 sysfs, или файловая система sys, используется для представления и управления информацией о драйверах и устройствах, которые присутствуют в системе. Эта файловая система структурирована по типам устройств и подсистемам, что делает её особенно удобной для получения информации о конфигурации оборудования и управления.

Например, через файлы в /sys/class/gpio/ можно управлять GPIO пинами на устройствах, поддерживающих это. sysfs также используется для настройки параметров устройств, например, изменения яркости экрана или управления питанием.
👍1
💬 Для чего предназначена директива go:generate?

Директива go:generate используется для автоматизации генерации кода или других команд, которые должны выполняться перед сборкой пакета.

Она служит инструкцией для инструмента go generate, который нужно запустить вручную или как часть сценария сборки. Пример использования go:generate может включать генерацию моков для тестирования, предварительную обработку или создание дополнительных исходных файлов на основе шаблонов.

📌 Пример использования:


//go:generate mockgen -destination=mocks/mock_myinterface.go -package=mocks my/package MyInterface


Здесь go:generate указывает инструменту go generate выполнить команду mockgen для создания мок-версии интерфейса MyInterface.
💬 Что такое RPC и как его поддерживает Go?

Remote Procedure Call (удаленный вызов процедур) — технология взаимодействия между клиентом и сервером, которая позволяет клиенту вызывать процедуры (функции, методы) на удаленном сервере, как если бы они были локальными.

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

Go имеет поддержку RPC через пакеты стандартной библиотеки, в первую очередь net/rpc и net/rpc/jsonrpc.
👍4🤔2
💬 Что такое микросервисная архитектура?

Микросервисная архитектура — распространенный подход к разработке ПО, когда приложение разбивается на небольшие автономные компоненты (микросервисы) с четко определенными интерфейсами.

Каждый отдельный сервис выполняет определённую функцию и общается с другими сервисами через API. Эти сервисы обычно разрабатываются, развёртываются и управляются независимо друг от друга.
👍5
💡 io.TeeReader можно использовать для копирования содержимого одного ридера в новый. Этот метод полезен, когда тело HTTP-запроса нужно прочитать дважды.

👉 Юзкейс: логирование входящих запросов с помощью middleware перед обработкой запросов.

#tip by Golangbot
🔥17
💬 Как использовать буферизированные каналы в качестве семафоров для ограничения выполнения горутин?

Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.

Мы можем создать семафор с использованием буферизированного канала, где размер канала определяет, сколько горутин могут работать одновременно.

Вот что происходит:

🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.

В примере:

🔹 wg.Add(10): готовимся к завершению задач 10 горутинами.
🔹 make(chan struct{}, 3): создает семафор, который позволяет одновременно работать только трем горутинам.

☑️ Если нам нужен более чистый способ, мы могли бы создать тип Semaphore, который обрабатывает все действия, связанные с семафором.
☑️ Использование кастомного типа Semaphore упрощает управление доступом к ресурсам в наших функциях.
☑️ Также существует реализация семафора в пакете golang.org/x/sync/semaphore. Он позволяет горутине использовать более одного слота, что полезно в сценариях, где задачи различаются по потреблению ресурсов.
👍23
🦾🧠🏋️Качаем мозги к лету!

Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.

➡️ Алгоритмы и структуры данных 35 990 ₽ 21 594

⭐️ Переходите и активируйте бесплатные вводные занятия курсаhttps://proglib.io/w/da6727d1

Вас ждут:

– 150 практических заданий и 47 видеолекций

– бессрочный доступ к обучению

– поддержка преподавателя в чате

А также очень харизматичный спикер из Яндекса 🙌🏻
🥱3