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

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

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

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

Наши каналы: https://t.iss.one/proglibrary/9197
Download Telegram
🔥 Сегодня последний день скидки!

На недавнем вебинаре «ИИ-агенты: новая фаза развития 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👍1
Что такое зомби-процесс в линукс

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

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

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

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
👍6
Почему индексация начинается с нуля

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

Массив — это непрерывный участок памяти. Индекс элемента фактически является смещением от начала этого участка. Если первый элемент имеет индекс 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
👾1
Как вам вопросы прошедшей недели

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуется фидбек в комментах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🤔3👍2🥱2
Чем отличается flag.StringVar от flag.String

1. flag.StringVar

Принимает указатель на существующую переменную и записывает туда значение флага из командной строки.

Сигнатура: func StringVar(p *string, name string, value string, usage string)

Позволяет явно контролировать, в какую переменную попадёт значение флага.

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

2. flag.String

Создаёт новую переменную (указатель на строку) и возвращает её, а значение устанавливается из командной строки.

Сигнатура: func String(name string, value string, usage string) *string

Возвращает указатель на автоматически созданную переменную.

Удобно, когда нужно быстро объявить переменную и сразу получить её значение по окончании парсинга.

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

Булевый флаг создаётся через flag.Bool. Если в командной строке указать только имя флага (-v), значение будет true. Можно также явно задать -v=false.

verbose := flag.Bool("v", false, "Enable verbose mode")
flag.Parse()
if *verbose {
fmt.Println("Verbose logging enabled")
}


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👾1
Время прокачать алгоритмы с 40-процентной скидкой до конца октября

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

🔹 В курсе ты научишься:

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

🤔 Решаешь задачи только в тг каналах? Пройди курс и отправляйся на реальные собеседования!

🔗 Подробнее о курсе
🤔1
Что такое M:N scheduling

M:N scheduling в Go — это модель планирования, при которой множество горутин (M) выполняется поверх ограниченного количества потоков операционной системы (N). Это отличается от моделей 1:1 (каждая горутина — отдельный системный поток) и N:1 (все горутины на одном системном потоке).

В Go реализована модель M:N с использованием трех основных сущностей:

• G (Goroutine) — легковесная пользовательская горутина с собственным стеком и контекстом исполнения.

• M (Machine) — системный поток, управляемый ОС, на котором реально выполняется код.

• P (Processor) — логический процессор, который связывает горутины с потоками, предоставляя им контекст и ресурсы для выполнения.

Количество P по умолчанию равно числу логических CPU или задается через runtime.GOMAXPROCS. Для выполнения горутин P должен быть привязан к M. Планировщик Go распределяет горутины между доступными P и M.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👾1
Что произойдёт при нескольких вызовах flag.Parse()

flag.Parse() разбирает аргументы только один раз.

Последующие вызовы не изменят результат, так как парсер уже прошёл по os.Args.

Если нужно повторно разобрать аргументы, например, для тестов, придётся сбрасывать os.Args или использовать кастомный парсер.

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