Библиотека 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
Как проверить, что контекст был отменён или достиг дедлайна

Каждый контекст, который может быть отменён (WithCancel, WithTimeout, WithDeadline), содержит канал Done(), который закрывается, когда контекст отменяется или истекает дедлайн.

select {
case <-ctx.Done():
fmt.Println("Context cancelled or deadline exceeded:", ctx.Err())
default:
// Продолжаем работу
}


Метод Err() позволяет получить конкретную причину, по которой контекст завершился.

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

time.Sleep(2 * time.Second) // превышаем таймаут

if err := ctx.Err(); err != nil {
fmt.Println("Context error:", err) // выведет: DeadlineExceeded
}


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Какие типы горутин есть в 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