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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Почему индексация начинается с нуля

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

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

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

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

Голодание. Иногда одни части программы забирают все ресурсы, а другие не могут работать — им всегда не хватает доступа.

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👏4
Как вам вопросы прошедшей недели

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍65🥱2
💡 Задача с собесеседования

Недавно в одном известном всем банке кандидату была предложена задача:

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


Вероятности, распределения, матожидание, градиенты — всё это может всплыть на интервью, и даже в продовых задачах.

🎓 Proglib запускает экспресс-курс «Математика для Data Science» — для тех, кто хочет закрыть эти пробелы и понять математику быстро, качественно и без боли.

🔍 На курсе вас ждет:

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

📅 Старт: 6 ноября
Формат: 10 вебинаров и 3 практических проекта
💬 Поддержка: менторы + Telegram-чат
💰 Стоимость: 37 000 ₽ (есть рассрочка)

🔗 Узнать больше и записаться
🥱4
Как получить неразобранные аргументы после парсинга флагов

После вызова flag.Parse() все оставшиеся аргументы (которые не являются флагами) можно получить через flag.Args().

flag.Parse()
fmt.Println("Remaining args:", flag.Args())


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁1
😵‍💫 Устал от бесконечной подготовки к собесам?

Тогда залетай к нам, есть задачка попроще.

Пройди в нашем боте мини-тест по математике и узнай, готов ли ты к Data Science или стоит что-то подтянуть.

📱 Перейти в бота
Можно ли определить пользовательские типы флагов

Да, для этого нужно реализовать интерфейс flag.Value с двумя методами:
type Value interface {
String() string
Set(string) error
}


После этого пользовательский тип можно зарегистрировать через flag.Var.

type MyFlag struct{}
func (m *MyFlag) String() string { return "" }
func (m *MyFlag) Set(value string) error { fmt.Println("Set value:", value); return nil }

var my MyFlag
flag.Var(&my, "myflag", "custom flag")
flag.Parse()


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🔥 Новый курс «Математика для Data Science»

Записывайтесь до 19.10 и получите бонус-курс «Школьная математика» для быстрого освежения знаний! 🚀

🧠 Эксперты-спикеры на курсе:

▫️ Диана Миронидис — преподаватель ВШЭ, автор Яндекс Практикума;

▫️ Ксения Кондаурова — преподаватель Центрального Университета (Т-Банк);

▫️ Маргарита Бурова — академический руководитель программ Wildberries & Russ.

👉🏻 Не упустите шанс улучшить свои навыки
🥱1
Как с помощью append сложить массивы

Чтобы объединить два слайса с помощью append, нужно использовать оператор распаковки — три точки.

Но тут есть важный нюанс — если у первого слайса достаточно capacity, то append может переиспользовать его базовый массив, и это может привести к неожиданному поведению.

Поэтому, если нужно сохранить оригинальный слайс без изменений, лучше создать новый пустой слайс и добавить в него сначала элементы первого, потом второго.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💥 Математика, которая не «для галочки»

Разработали курс «Математика для Data Science» специально для вас — чтобы закрыть все пробелы в математике и уверенно пройти любое собеседование на позицию Data Scientist.

🧠 За 2 месяца ты разберёшь:

➡️ линейную алгебру — работа с векторами и матрицами, их разложения, собственные значения и обратные матрицы;

➡️ мат. анализ — пределы, производные, экстремумы, применение градиентного спуска;

➡️ теорию вероятностей и статистику — случайные величины, распределения, статистические гипотезы, A/B-тесты;

➡️ математику в ML и аналитике — как использовать всё это в алгоритмах, логистической регрессии, методах ближайших соседей, байесовских подходах.

📚 Формат: 10 вебинаров, 3 практических проекта, тесты и чат с менторами.

🔥 При оплате до 19 октября получите курс по базовой математике в подарок.

🔗 Записаться на курс
2
Как работает автоматическая помощь -h или --help

При вызове программы с флагом -h пакет flag автоматически выводит список всех объявленных флагов с их описанием и значением по умолчанию. Это не требует дополнительного кода для справки.

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

Самый универсальный способ — использовать встроенный пакет reflect. Он позволяет получить информацию о типе любой переменной.

Метод TypeOf() возвращает объект Type, который содержит полную информацию о типе: имя, размер, методы и другие характеристики:
func main() {
var x interface{} = 42
var y interface{} = "привет"
var z interface{} = []int{1, 2, 3}

fmt.Println(reflect.TypeOf(x)) // int
fmt.Println(reflect.TypeOf(y)) // string
fmt.Println(reflect.TypeOf(z)) // []int
}


Когда вы работаете с интерфейсами и хотите проверить конкретный тип, используйте type assertion:
func processValue(val interface{}) {
if str, ok := val.(string); ok {
fmt.Printf("Это строка: %s\n", str)
} else if num, ok := val.(int); ok {
fmt.Printf("Это число: %d\n", num)
} else {
fmt.Println("Неизвестный тип")
}
}


Когда нужно обработать несколько типов, type switch читается намного проще:
func describe(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Целое число: %d\n", v)
case string:
fmt.Printf("Строка длиной %d символов\n", len(v))
case []int:
fmt.Printf("Срез из %d элементов\n", len(v))
case bool:
fmt.Printf("Булево значение: %v\n", v)
default:
fmt.Printf("Неизвестный тип: %T\n", v)
}
}


Для быстрой отладки можно использовать форматированный вывод:
var data interface{} = map[string]int{"ключ": 100}
fmt.Printf("Тип переменной: %T\n", data) // map[string]int


Когда использовать каждый способ

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

Type assertion — для проверки одного-двух конкретных типов. Самый производительный вариант.

Type switch — когда нужно обработать несколько известных типов. Код получается чище и понятнее цепочки if-else.

%T в fmt — только для отладки и логирования.

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