Библиотека Go для собеса | вопросы с собеседований
6.85K subscribers
235 photos
9 videos
1 file
492 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.iss.one/proglibrary/9197
Download Telegram
Какие типы горутин есть в Go

Формально они не делятся на типы, но по применению можно выделить обычные (для асинхронных задач), для параллелизма (с sync.WaitGroup или каналами), для обработки событий (например, в серверах), в пуле воркеров (для управления нагрузкой) и фоновые (для длительных задач).

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍1
Можно ли использовать один контекст для нескольких горутин

Да, один контекст в Go можно использовать в нескольких горутинах одновременно.

Контекст — это immutable-структура: она содержит информацию о дедлайне, таймауте, функции отмены и ключ-значение, и при этом безопасна для параллельного доступа. Это значит, что несколько горутин могут слушать один и тот же контекст и реагировать на его отмену без риска гонок или повреждения данных.

Например, если создать контекст с таймаутом, несколько воркеров могут одновременно подписаться на ctx.Done(). Как только таймаут срабатывает или вызывается cancel(), канал закрывается, и все горутины получают сигнал и корректно завершают работу.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🤔1
🔥 Сегодня последний день скидки!

На недавнем вебинаре «ИИ-агенты: новая фаза развития AI» мы показали, как агенты уже меняют работу Data Scientists и инженеров.

Что тебя ждёт на курсе:

⚡️ создашь своего ИИ-агента с нуля
⚡️ соберёшь RAG-систему
⚡️ научишься адаптировать LLM под реальные данные бизнеса

До конца этого дня цена на курс 57 000 ₽. Уже завтра будет 69 000 ₽. Успевай записаться (используй промокод datarascals).

🔗 Записаться на курс
1
Последние часы со скидкой!

Мы уже закрыли вебинар «ИИ-агенты: новая фаза развития AI», но запись всё ещё доступна.

А дальше остаётся только практика. На курсе «ИИ-агенты для DS-специалистов» ты научишься разрабатывать агентов, собирать RAG-системы и адаптировать LLM под бизнес.

Сегодня цена ещё 57.000 ₽ с промокодом datarascals.
Завтра — 69.000 ₽.

👉 Успеть оплатить до полуночи
1
Как работает исключающее или

XOR (исключающее ИЛИ) — это логическая и побитовая операция, которая возвращает 1, если входные биты различны, и 0, если они одинаковы.

Результат для двух битов:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍1
Зачем нужен пустой интерфейс

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

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

Коллекции разных типов
items := []interface{}{1, "hello", 3.14}


Функции с параметрами любых типов
func PrintValue(v interface{}) {
fmt.Println(v)
}


Передача метаданных или контекста
Пустой интерфейс используется для хранения идентификаторов, параметров или значений в структурах типа map[string]interface{}.

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

log — стандартный пакет.

slog — стандартный пакет в Go 1.25+.

logrus — популярная библиотека, поддерживает уровни логов, хуки и форматирование (JSON, текст).

zap — высокопроизводительное структурированное логирование, оптимально для микросервисов.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Что такое зомби-процесс в линукс

Зомби-процесс — это завершившийся процесс, который всё ещё числится в таблице процессов, потому что его родитель не вызвал wait() для чтения кода завершения. Такой процесс не использует память или CPU, но его PID и запись в таблице остаются.

По сути, это механизм ОС для передачи информации о завершении от дочернего процесса к родительскому. Если родитель забывает забрать статус, зомби остаётся висеть. Один-два зомби не страшны, но их накопление может переполнить таблицу процессов и блокировать запуск новых.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2
Какие знаете бест практис по использованию интерфейсов

1. Чем меньше методов в интерфейсе — тем лучше. Классический пример — io.Reader и io.Writer. Один метод, зато супер универсально.

type Stringer interface {
String() string
}


2. Принимать интерфейсы, а возвращать конкретные типы.

Это удобно и для тестов, и для читаемости. Функция, которая что-то использует, пусть принимает интерфейс, а фабрика или конструктор возвращает конкретный тип.

func Process(r io.Reader) error { ... }       // принимаем интерфейс
func NewBuffer() *bytes.Buffer { ... } // возвращаем структуру


3. Не создавать интерфейсы на будущее. Если абстракция сейчас не нужна — лучше оставить конкретный тип, иначе код будет сложнее без пользы.

4. Переиспользовать стандартные интерфейсы, если они подходят. В стандартной библиотеке уже много хороших примеров — error, fmt.Stringer, context.Context.

5. Осторожно с interface{}. Это, по сути, отключение типизации. Если нужен универсальный контейнер — ок, но в остальном лучше обойтись конкретными интерфейсами или дженериками.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Почему индексация начинается с нуля

Индексация с нуля исторически связана с тем, как данные хранятся в памяти.

Массив — это непрерывный участок памяти. Индекс элемента фактически является смещением от начала этого участка. Если первый элемент имеет индекс 0, то его адрес равен base_address + 0 * size. Для второго элемента — base_address + 1 * size и так далее.

Кроме того, нулевая индексация упрощает работу с циклами и диапазонами. Например, цикл for i := 0; i < len(arr); i++ интуитивно проходит весь массив без лишних корректировок. Если бы индексация начиналась с единицы, пришлось бы постоянно делать «−1» или «+1» в выражениях.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Для чего предназначен пакет flag в Go

Пакет flag предназначен для разбора аргументов командной строки в приложениях на Go. Он позволяет определять флаги с конкретными типами (string, int, bool), задавать значения по умолчанию и описание, а затем считывать их в коде.

Это упрощает создание CLI-приложений и обработку параметров запуска без необходимости вручную разбирать os.Args.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚1
Как создать строковый флаг

Для создания строкового флага используется функция flag.String. Она принимает имя флага, значение по умолчанию и описание, и возвращает указатель на переменную. После объявления всех флагов нужно вызвать flag.Parse(), чтобы разобрать аргументы командной строки.

Пример:
var name = flag.String("name", "Guest", "User name")
flag.Parse()
fmt.Println("Hello,", *name)


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