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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Как форматировать исходный код на Go идиоматично?

Идиоматичный Go-код — это код, написанный в соответствии с общепринятыми стилевыми и архитектурными стандартами языка Go, отражающий лучшие практики и философию языка.

🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
🥱7👏4👍1😢1
🎉 Розыгрыш от Proglib Academy и DigitalRazor!

С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!

🎁 Призы для участников акции:

Игровой ПК DigitalRazor ProGaming
VIP-пакет курса Proglib Academy

💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.

Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.

📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.

Выбрать курс
Что такое «goroutine leak», как его можно предотвратить и как диагностировать такие утечки?

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

Причины утечек горутин:

🎯 Горутину, которая ждет данных из канала, нельзя завершить, если канал не закрыт.
🎯 Если горутина застревает в select или for без выхода, например, в ожидании данных из канала, который больше не отправляет значения.
🎯 Если горутина не проверяет context.Done() для завершения, она может продолжать работать, даже если операция больше не нужна.

Как предотвратить:
Использование контекста (context) для отмены длительных операций. Важно проверять context.Done() для своевременного завершения работы горутины.
Закрытие каналов, когда больше не требуется передавать данные, чтобы все горутины, ожидающие на этом канале, могли завершиться.
Обработка ошибок и гарантии выхода из блокирующих операций в случае ошибок или таймаутов.

Как диагностировать:
🛠️ Профилирование с помощью pprof: инструмент позволяет отслеживать активные горутины и выявлять утечки.
🛠️ Тестирование на гонки: использование команды go test -race помогает обнаружить ошибки синхронизации, которые могут привести к утечкам.
🛠️Мониторинг горутин: с помощью логирования или специфичных инструментов (например, Go-Routine Inspector) можно отслеживать, какие горутины остаются активными.
👍9
Что такое пустой интерфейс в Go? Когда его лучше использовать и когда не стоит?

«Empty interface» в Go ( interface{} ) — это интерфейс, не имеющий методов. Поскольку все типы реализуют пустой интерфейс, его можно использовать для хранения значений любых типов.

Когда использовать:
Когда нужно хранить объекты разных типов, например, в коллекциях (срезах или мапах).
Для обработки данных, тип которых заранее неизвестен, например, при работе с JSON или при передаче произвольных данных в функции.
Когда функция должна принимать различные типы данных.

Когда не использовать:
Использование скрывает типы и может привести к ошибкам на этапе выполнения. Лучше использовать конкретные типы, когда это возможно.
Преобразование типов из может быть затратным, что важно учитывать в производительных системах.
👍7
Что такое nil ошибка в Go и как её правильно обрабатывать?

Если ошибка равна nil, это означает, что операция была успешной, и можно продолжать использовать возвращённые данные. Правильная обработка nil ошибки заключается в явной проверке каждого возвращаемого значения ошибки и принятии мер в зависимости от того, является ли ошибка nil или нет.
🥱18👍7😁2👾1
В чем отличие между каналами, которые буферизуются, и небуферизованными каналами в Go?

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

Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.
👍12
Почему в проектах на Go разработчики часто предпочитают использовать сторонние библиотеки для логирования, такие как zap или logrus, вместо стандартного пакета log?

Они поддерживают уровни логирования (DEBUG, INFO, WARN, ERROR), что позволяет более гибко управлять выводом сообщений в зависимости от окружения. Кроме того, они предоставляют структурированное логирование, где сообщения представляют собой набор ключей и значений.
Например, лог в JSON вместо строки:
{«level»: «info», «message»: «User logged in», «user_id»: 123 }

Это особенно полезно для автоматической обработки логов в системах мониторинга, таких как ELK или Loki.
Стандартный пакет чаще всего используется для простых скриптов и CLI-приложений. Для высоконагруженных, сложных или больших приложений лучшим выбором будут сторонние библиотеки.
👍15🤔3👾3🌚1
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍21
Как справляться с проблемой «fan-in» и «fan-out» в Go?

Для решения проблемы fan-out в Go нужно распределить задачи между несколькими горутинами, используя каналы. Каждая горутина обрабатывает данные и передает результаты обратно через канал. Для управления параллельными горутинами можно использовать sync.WaitGroup, чтобы гарантировать завершение всех горутин.

В случае fan-in несколько горутин отправляют результаты в один канал. Чтобы собирать данные без блокировок, используется конструкция select или дополнительные каналы для агрегации. Если горутин много, можно использовать несколько каналов для уменьшения вероятности блокировки и собрать все результаты в основной канал через select или другие механизмы синхронизации.
👍9
📈 Кадровый голод в IT: почему компании готовы платить на 13% больше

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

Если вам интересно, как кадровый рынок в IT адаптируется к новым вызовам, и что это значит для вас как для разработчика или работодателя, читайте дальше!

📎 Читать статью
🤔3
Что такое пакет unsafe в Go? Для чего его используют?

Пакет unsafe в Go предоставляет функции, которые позволяют обрабатывать память и данные с низким уровнем доступа, минуя некоторые ограничения безопасности языка Go. Он предоставляет инструменты для работы с памятью и типами данных, которые обычным способом в Go нельзя напрямую манипулировать.
Это пакет используется в случаях, когда нужно провести оптимизацию или взаимодействовать с системными библиотеками, где стандартные средства языка не обеспечивают необходимой гибкости.
🔥7👍4
В следующем коде происходит паника. Объясните, что именно вызывает её

ch := make(chan int, 1)
ch <- 42
close(ch)
ch <- 23


В Go запись в закрытый канал вызывает панику. Чтобы избежать этой ошибки, нужно убедиться, что мы не пытаемся записывать в канал после его закрытия.
👍11🥱21
Расскажите о механизме select в Go и как он работает с каналами при параллельной обработке данных?
Механизм select в Go — это примитив синхронизации для работы с каналами.

При использовании select:
⚙️ Блокируется выполнение потока
⚙️ Ожидается готовность одного из каналов
⚙️ При готовности нескольких каналов выбор происходит случайно

Ключевые особенности:
🛠️ Позволяет синхронизировать параллельные процессы
🛠️ Предотвращает взаимные блокировки
🛠️ Обеспечивает недетерминированный выбор канала

Применяется для эффективного управления конкурентностью в Go.
🔥6👍21
Поддерживает ли Go объединённые типы?

Go не поддерживает объединённые типы напрямую, как это делают другие языки (например, TypeScript или Rust). В Go переменные всегда имеют фиксированный тип. Однако, с помощью интерфейсов и пустого интерфейса (interface{}), можно реализовать функциональность, схожую с объединёнными типами.
👍8
Как в Go можно реализовать работу с объединёнными типами, если язык не поддерживает их напрямую?
В Go для реализации работы с объединёнными типами используется пустой интерфейс (interface{}), который может хранить значения любого типа. Для извлечения значения используется type assertion. Пример на скриншоте.
Здесь переменная x может быть любым типом, и с помощью type assertion проверяется, является ли она строкой.
👍9
В чем разница между context.Background() и context.TODO()?

context.Background() используется для создания базового контекста, который не имеет родительского контекста. Он подходит для корневых вызовов в программе, например, в функции main().

context.TODO() применяется, когда контекст должен быть задан, но решение о его правильности или необходимости еще не принято. Это временный контекст, который можно позже заменить на более специфичный, когда появится необходимая информация.
👍6🔥2
🗃️ Анатомия SQL-запроса: как работают запросы к базе данных

Как разработчику эффективно работать с базами данных?
Один из ключевых навыков — понимание, как именно выполняются SQL-запросы. В этой статье разобраны все этапы работы запросов с базой данных: от парсинга до оптимизации.
Это поможет не только улучшить производительность приложений, но и избежать частых ошибок при взаимодействии с БД.

📎 Погружаемся в анатомию SQL-запросов по ссылке!
👍1
Как контексты используются для отмены операций в многозадачных приложениях?

Контексты в Go предоставляют механизм для отмены операций в многозадачных приложениях за счет передачи сигнала отмены через объект context.Context. Это особенно полезно в сценариях, где горутины выполняют связанные задачи, такие как обработка HTTP-запросов или долгие вычисления.

Принцип работы:
1. Создаётся контекст с функцией отмены (context.WithCancel или context.WithTimeout).
2. Все горутины получают этот контекст и периодически проверяют ctx.Done().
3. Когда вызвана отмена (например, через cancel()), канал ctx.Done() закрывается.
4. Каждая горутина обрабатывает сигнал отмены, например, освобождая ресурсы и завершая выполнение.
👍8
Что такое uintptr, когда его следует использовать?

uintptr — это тип в Go, который представляет собой целое число, используемое для хранения значений указателей как чисел, то есть для представления адресов памяти в виде целых чисел. Он позволяет выполнять низкоуровневые операции с указателями, такие как арифметика указателей или преобразование указателя в числовое значение и обратно

Когда следует использовать uintptr:
🛠️ Низкоуровневые операции: uintptr используется, когда необходимо работать с указателями на уровне адресов, например, для выполнения арифметики указателей (сдвиг по памяти) или для взаимодействия с C-библиотеками через cgo, где указатели часто обрабатываются как целые числа.

🛠️ Преобразование указателя в целое число: иногда необходимо преобразовать указатель в целочисленное значение (например, для передачи в системные вызовы или манипуляции с памятью). В таких случаях uintptr может быть полезен для хранения числового представления указателя.

🛠️ Взаимодействие с аппаратным обеспечением: в некоторых случаях работы с аппаратным обеспечением или низкоуровневыми системами можно использовать uintptr для работы с памятью напрямую.
👍7
Подготовься к собеседованию на позицию Data Scientist!

Профессия Data Scientist становится все более востребованной, и компании ищут специалистов, способных превращать данные в ценные инсайты. Но как успешно пройти техническое собеседование?

Мы собрали 10 типичных задач, которые могут встретиться на собеседовании, и эффективные подходы к их решению:

1. Внешнее и тензорное произведение

2. One-hot кодировка

3. Мониторинг осадков

4. Симуляция бросков кубиков в «Монополии»

5. Бурение скважин для добычи золота

6. Вычисление свертки

7. Бэктестинг торговой стратегии

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

9. Обнаружение спама с использованием дерева решений

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

Чтобы начать решать задачи, достаточно ответить на четыре простых вопроса по этой ссылке и получить доступ к вводным занятиям курса Математика для Data Science и 10 задачам.
👍1