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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
😵‍💫 Устал от бесконечной подготовки к собесам?

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

Пройди в нашем боте мини-тест по математике и узнай, готов ли ты к 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
Чем отличаются методы Time.Sub() и Time.Add() в пакете time

Time.Sub() — метод вычисляет разницу между двумя моментами времени.

start := time.Now()
time.Sleep(2 * time.Second)
end := time.Now()

duration := end.Sub(start) // ≈ 2 секунды
fmt.Println(duration) // 2.001234567s


Time.Add() — метод добавляет или вычитает при отрицательном значении длительность к/от момента времени и возвращает новое время.

now := time.Now()
tomorrow := now.Add(24 * time.Hour)
yesterday := now.Add(-24 * time.Hour)

fmt.Println("Завтра:", tomorrow)
fmt.Println("Вчера:", yesterday)


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧠 Курс «Математика для Data Science»

Математика лежит под капотом не только алгоритмов, но и всего, что мы создаём — от систем рекомендаций до маршрутизации такси.

Но главное, математика понятна, если объяснить её на языке разработки.

📘 Курс «Математика для Data Science»:

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

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

🗓️ Старт курса → 6 ноября

👉 Записаться на курс
🌚2
Почему time.After для таймаутов может привести к утечке памяти

Когда вы вызываете time.After, внутри создаётся таймер. Этот таймер будет жить и занимать память до самого срабатывания — даже если он вам больше не нужен.

Типичный код с утечкой:
for {
select {
case msg := <-messages:
process(msg)
case <-time.After(5 * time.Second):
// проверяем что-то каждые 5 секунд
}
}


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

Правильное решение

Используйте time.NewTimer — он даёт контроль над таймером:
timer := time.NewTimer(5 * time.Second)
defer timer.Stop()

for {
select {
case msg := <-messages:
process(msg)
timer.Reset(5 * time.Second)
case <-timer.C:
// проверка по таймауту
timer.Reset(5 * time.Second)
}
}


Теперь таймер один — вы его переиспользуете. После обработки сообщения сбрасываете через Reset, и он снова начинает отсчёт. Не нужно? Вызываете Stop, и память освобождается сразу.

Если таймаут разовый и вы точно знаете, что он сработает — time.After подходит:
select {
case result := <-doWork():
return result
case <-time.After(10 * time.Second):
return errors.New("timeout")
}


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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥133👍3👾2😢1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥Обсуждаем все, что волнует Go-сообщество: 1 ноября Яндекс проведет митап для разработчиков по Go

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

В докладной части: СТО Яндекс Игр Степан Пестерников расскажет, как они используют KV-хранилища и кеши. Старший разработчик Яндекс Маркета Александр Никитин покажет, как с помощью Debug Tree разобраться, как работает сложная многопоточная кодовая база. Разработчик бэкенда Плюса и Финтеха Игорь Панасюк разберет новый garbage collector в Go 1.25, и расскажет, какое влияние он окажет на ваши сервисы.

Отдельно на круглых столах офлайн-участники смогут обсудить использование AI-инструментов, highload, нетипичное применение Golang и другие актуальные для go-разработки темы.

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

💥 Регистрируемся здесь.
3👍1🤩1
Зачем нужна функция runtime.Version() и для чего её используют

runtime.Version() возвращает версию Go, которой скомпилирована программа.

Используется для:

• Диагностики — когда нужно понять, какой версией собран бинарник в продакшене

• Логирования — записываем версию Go при старте приложения для отладки

• Health-check эндпоинтов — отдаём информацию о версии в /health или /version

• Условной логики — редко, но иногда нужно обойти баги конкретных версий компилятора

• Валидации окружения — проверяем, что приложение собрано требуемой версией Go

Айтишники всегда развиваются. В этом отлично помогают наши курсы. Обязательно чекните — до конца октября ряд курсов со скидкой.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👾1
🔎 Собес сам себя не пройдет

Ты готов к собеседованию? А если проверю?

Залетай к нам и забирай курсы со скидкой 40%. Только до конца октября можно узнать много нового и отточить навыки.

🎯 Забирай курсы:

🐍 python для разработчиков;
🧮 алгоритмы и структуры данных;
📝 архитектуры и шаблоны проектирования;
🧩 основы IT для новичков.

Не упусти скидку и получи долгожданный оффер!
Какая разница между var, := и new() при объявлении переменных

var используется, когда нужно объявить переменную с явным типом или без начального значения:
var count int           // инициализируется нулевым значением (0)
var name string // инициализируется "" (пустая строка)
var isActive bool // инициализируется false
var users []User // инициализируется nil

var total = 100 // тип выводится автоматически
var message string = "Hello" // явное указание типа


Оператор := — это синтаксический сахар для объявления и инициализации переменных внутри функций:
func processOrder() {
status := "pending" // эквивалентно var status string = "pending"
count := 42 // эквивалентно var count int = 42
user := getUser() // тип выводится из возвращаемого значения
}


new() выделяет память, инициализирует её нулевым значением и возвращает указатель:
ptr := new(int)         // *int, значение 0
fmt.Println(*ptr) // 0

user := new(User) // *User, все поля в нулевых значениях


На практике new() используется редко, потому что короткое объявление с & делает то же самое, но понятнее:
// Эквивалентные записи:
ptr1 := new(int)
ptr2 := &int{} // более идиоматично

user1 := new(User)
user2 := &User{} // более наглядно


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Какой объект требуется для создания sync.Cond

Для создания sync.Cond в Go требуется любой объект, реализующий интерфейс sync.Locker, например sync.Mutex или sync.RWMutex.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🎲 Знаешь, что хуже всего на собесе?

Когда задают простой вопрос, а ты не можешь ответить.

🤔 Это ощущение, когда понимаешь:
«Блин, я это знаю... вроде... сейчас...»


От «я знаю...» до «сейчас объясню!» всего один курс.

Алгоритмы и структуры данных — от Big O до задач криптографии.

Python для разработчиков — пиши чистый и эффективный код.

Архитектуры и шаблоны — строй системы, которые масштабируются.

Основы IT — всё необходимое для входа в профессию.

Выбирай любой и забирай со скидкой 40% только до конца октября.

🔗 Выбрать курс
Что такое неэкспортируемая пустая структура

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

Зачем она нужна

• Неэкспортируемую пустую структуру часто используют, чтобы обозначить, что тип реализует определённый интерфейс, или для добавления семантики без хранения состояния.

• Так как struct{} занимает 0 байт, её используют в ситуациях, где нужно просто присутствие элемента без данных:
set := map[string]struct{}{}
set["apple"] = struct{}{}


• Пустая структура идеальна для каналов, передающих только сигнал, а не данные:
done := make(chan struct{})
go func() {
// работа
done <- struct{}{}
}()
<-done


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

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

Стандартная библиотекаmath.Round(), math.Floor(), math.Ceil() и math.Trunc()
math.Round(2.5)  // 3
math.Round(2.4) // 2
math.Round(-2.5) // -3
math.Floor(2.7) // 2 — всегда вниз
math.Ceil(2.1) // 3 — всегда вверх
math.Trunc(2.9) // 2
math.Trunc(-2.9) // -2


Важный нюанс: эти функции возвращают float64. Если нужно целое число, приводим к int:
result := int(math.Round(2.5)) // 3


Округление до N знаков после запятой вручную:
func roundToDecimal(num float64, precision int) float64 {
shift := math.Pow(10, float64(precision))
return math.Round(num * shift) / shift
}

roundToDecimal(3.14159, 2) // 3.14


Но здесь есть подвох с float64 — погрешность может накапливаться. Для финансов это не подходит.

Decimal библиотеки:
import "github.com/shopspring/decimal"

num := decimal.NewFromFloat(3.14159)

num.Round(2) // 3.14
num.RoundUp(2) // 3.15 — всегда вверх
num.RoundDown(2) // 3.14 — всегда вниз
num.RoundBank(2) // банковское округление


math/big для высокой точности:
num := new(big.Float).SetFloat64(3.14159)
rounded := new(big.Float)

// Устанавливаем точность и режим округления
rounded.SetPrec(53) // точность в битах
num.SetMode(big.ToNearestEven) // режим округления


Для финансов всегда decimal с явным режимом округления. Для остального — math вполне достаточен.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾1
Что такое жадный алгоритм

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

Пример. Задача о размене монет:
// Выдать сдачу 63 рубля монетами: 50, 10, 5, 2, 1
// Жадный подход: берем максимальную монету
func giveChange(amount int) []int {
coins := []int{50, 10, 5, 2, 1}
result := []int{}

for _, coin := range coins {
for amount >= coin {
result = append(result, coin)
amount -= coin
}
}
return result // [50, 10, 2, 1] - работает!
}


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как ускорить браузер

Закрой все вкладки со словами «MacBook», «купить ноутбук», «ноут в рассрочку». Потому что у нас есть решение лучше.

🔥 Proglib разыгрывает MacBook Pro 14. Формула простая: покупаешь любой курс до 15 ноября → учишься 2 недели → пишешь куратору #розыгрыш

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

👉🏻 Выбрать курс для участия
🥱5