Библиотека Go для собеса | вопросы с собеседований
6.84K subscribers
221 photos
5 videos
1 file
402 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Как следить за временем жизни горутины и зачем это делать

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

Основной инструмент для управления временем жизни горутины — это context.Context. Он позволяет задать дедлайн или тайм-аут и передать этот контекст внутрь горутины. Горутине нужно проверять канал <-ctx.Done() и корректно завершаться, когда этот канал закрывается. Это позволяет, например, автоматически завершать работу горутин по истечении заданного времени или по сигналу отмены извне.

Также можно использовать каналы управления вручную, передавая в горутину канал stop или done, и завершать её при получении сигнала. Такой способ полезен, если не требуется гибкость context, но нужно просто и понятно управлять остановкой.

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

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

Если же объект простой, лёгкий или менять его не нужно — передавай по значению. Так безопаснее, проще для отладки, и точно не получится неожиданных побочных эффектов.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🥱5
В чём разница между replace, exclude и require в go.mod?

require — явно добавляет зависимость (и её версию) в проект.

replace — подменяет одну версию/путь зависимости на другую (например, локальную или форк).

exclude — exclude — исключает конкретную версию модуля из разрешения зависимостей. Это не удаляет модуль целиком, но не даст использовать именно эту версию (например, если она багованная).

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Что имеется в виду под статической компиляцией

Статическая компиляция в Go — это процесс, при котором компилятор Go встраивает все зависимости (включая стандартные библиотеки и сторонние пакеты) в один исполняемый бинарный файл.

Иными словами: результат сборки (go build) — это один самодостаточный бинарник, который можно запустить без дополнительных библиотек, файлов или окружения. Всё, что нужно программе для работы, уже внутри.

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

Этот паттерн называется Адаптер. Он позволяет преобразовать интерфейс одного класса в интерфейс, который ожидает клиент. Это полезно, когда у нас есть классы с несовместимыми интерфейсами, но нам нужно использовать их в одном контексте.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Библиотека Go для собеса | вопросы с собеседований
Какой паттерн позволяет объединить несколько различных интерфейсов в один Этот паттерн называется Адаптер. Он позволяет преобразовать интерфейс одного класса в интерфейс, который ожидает клиент. Это полезно, когда у нас есть классы с несовместимыми интерфейсами
Признаёмся, взяли вопрос без корректировок с одного из интервью 👀

В хорошем собеседовании интервьюер не просто задаёт вопросы, но и даёт фидбек по ответу и даже может объяснить концепцию которую он спросил.

Человеческий фактор не исключение, поэтому советуем уточнять что имеет в виду человек по ту сторону интервью.

Пример для вопроса про адаптер
// Target - интерфейс, который ожидает клиент
type Target interface {
Request() string
}

// Adaptee - устаревший класс, который не соответствует интерфейсу Target
type Adaptee struct{}

func (a *Adaptee) SpecificRequest() string {
return "Специфический запрос из Adaptee"
}

// Adapter - адаптирует интерфейс Adaptee к интерфейсу Target
type Adapter struct {
adaptee *Adaptee
}

func (a *Adapter) Request() string {
// Адаптируем специфический запрос Adaptee к формату, который ожидает Target
return a.adaptee.SpecificRequest()
}


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

YAGNI (You Aren't Gonna Need It) — это принцип разработки программного обеспечения, который утверждает, что не стоит добавлять функциональность или код, который на данный момент не нужен. Идея заключается в том, чтобы сосредоточиться только на тех фичах и решениях, которые действительно требуются для текущей задачи, а не строить «на будущее» на основе предположений о том, что может быть нужно.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🔥 IT Breaking Memes — 30 000 ₽ за самую смешную IT-новость

Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!

👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.

🏆 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе

Пример:
Реальная новость: «Гугл создала модель для общения с дельфинами».

Смешная альтернатива: «Нейросеть от Гугл обрабатывает видеопоток с камеры в свинарнике. ИИ следит, сколько свинья находится возле кормушки, не отталкивают ли ее собратья. Недокормленных докармливают, а переевшие пропускают следующую кормешку».

📅 Сроки: с 29 апреля по 11 мая включительно

Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8

Ждем ваших новостей!
🥱2👍1
Почему defer функции выполняются в LIFO порядке

Основная причина заключается в том, как работает стек вызовов. Стек — это структура данных, которая работает по принципу последним пришел — первым ушел.

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

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

Если один и тот же кусок логики используется в разных местах, следует вынести его в отдельную функцию или метод.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱31
Как взять ссылку на значение в мапе

В Go нельзя напрямую взять ссылку на значение в мапе — это ограничение языка, связанное с внутренним устройством мап. Значение по ключу в мапе
может перемещаться в памяти, Go может реорганизовывать хеш-таблицу.

Пример, который не скомпилируется:
m := map[string]int{"a": 1}
p := &m["a"]


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👾21👍1
Как передавать множество результатов функции

В Go можно возвращать несколько значений из функции напрямую — это одна из встроенных возможностей языка.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱28😁8👍2
📅 Итоги недели — нужна ваша реакция

Были интересные вопросы? Может сложновато или наоборот слишком скучно?

Можно просто:
🔥 — нравится
🌚 — так себе
😢 — скучно

Комментарии тоже приветствуются.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥48🌚24🤔2😢1👾1
Какие варианты циклов есть в Go

1. Классический for
for i := 0; i < 10; i++ {
fmt.Println(i)
}


2. Условный for (как while)

i := 0
for i < 10 {
fmt.Println(i)
i++
}


3. Бесконечный цикл
for {
fmt.Println("infinite loop")
break // не забудь выйти
}


4. for range — итерация по коллекции
for index, value := range []string{"a", "b", "c"} {
fmt.Println(index, value)
}


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱11👍10
Что такое cookiejar в Go и для чего он используется

Библиотека cookiejar предоставляет механизм для управления HTTP-куками. Это часть стандартной библиотеки.

cookiejar позволяет автоматически сохранять и отправлять куки при работе с HTTP-запросами. Куки могут быть получены в ответах сервера и автоматически добавляться в будущие запросы, что позволяет поддерживать состояние между запросами (например, при аутентификации через сессии).

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость

Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.

👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.

🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе

🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.

📅 Сроки: прием новостей до 11 мая включительно

Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8

Осталась неделя — ждем ваших новостей!
Что такое пакет net/mail в Go и какие задачи он решает

Пакет net/mail используется для создания, парсинга и обработки почтовых сообщений в формате MIME. Он помогает работать с заголовками сообщений, такими как From, To, Subject, и позволяет парсить и формировать MIME-сообщения. Основной функцией пакета является работа с адресами электронной почты и создание сообщений, готовых к отправке через SMTP.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Что из себя представляет паттерн Strangler Fig

Название происходит от одноимённого тропического растения, которое растёт вокруг дерева-хозяина, постепенно вытесняя его. По аналогии, новая система «обрастает» старую, заменяя её части одну за другой, пока полностью не вытеснит.

Как это работает:

— Создаётся прокси/фасад перед старой системой.
— Новые функции разрабатываются сразу в новой архитектуре.
— Старые модули постепенно переписываются и переносятся.
— После переноса очередной части — обновляется маршрутизация, чтобы трафик шёл в новую реализацию.
— По завершении — старая система удаляется.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👾21
Можно ли добиться от быстрой сортировки времени выполнения O(n log n)

Классическая быстрая сортировка выбирает опорный элемент. Если выбор плохой — например, всегда крайний элемент массива — и массив уже отсортирован (или почти), происходит деградация: один подмассив получает почти все элементы, а другой — почти пустой. Это приводит к дереву рекурсии глубиной n, и итоговая сложность становится O(n²).

Если опорный элемент выбирается случайно, то с высокой вероятностью дерево рекурсии будет сбалансированным. Это даёт среднюю сложность O(n log n), даже на почти отсортированных данных.

Выбор опорного элемента как медианы из первого, среднего и последнего элементов. Существенно снижает вероятность деградации при частично отсортированных массивах.

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