Библиотека 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 разработчики часто предпочитают использовать сторонние библиотеки для логирования, такие как 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
⚡️Самые полезные каналы по Go в одной папке

В ней:
канал для подготовки к собеседованиям
интересные задачи
основной канал (этот)
книги по Go
лучшие вакансии из сферы
и наш чат, в котором можно общаться и задавать вопросы

Добавляйте 👉 тык сюда
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему использование uintptr может быть опасным?

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

Сборщик мусора: go использует сборщик мусора, который не отслеживает указатели, преобразованные в uintptr. Это может привести к ошибкам, если память была освобождена или перемещена.

Низкоуровневый доступ: uintptr представляет собой «сырой» адрес памяти, что делает операции с ним небезопасными, так как компилятор не может проверять правильность обращения к памяти.

Гонки данных: в многозадачных приложениях использование uintptr может привести к гонкам данных, поскольку не обеспечивается синхронизация или безопасность типов.
👍3
Что такое defer в Go и какие варианты использования существуют?

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

Как его можно использовать?
🎯 defer часто используется для освобождения ресурсов, таких как закрытие файлов, соединений с базой данных или освобождение памяти.
🎯 defer полезен для выполнения кода, который должен быть выполнен независимо от того, произошла ли ошибка в функции или нет.
👍6🥱1
💾 CDC vs Outbox: как решить проблему двойной записи в распределенной системе

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

Как избежать проблем двойной записи? Современные подходы, такие как захват изменений данных (CDC) и паттерн Outbox, предлагают интересные решения. Эти методики позволяют поддерживать целостность данных, избегать сбоев и минимизировать риски.

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

🔗 Читать статью
🔗 Зеркало
Как slice устроен под капотом?

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

Указатель (pointer):
Это указатель на первый элемент массива, на основе которого создаётся slice. Это может быть любой внутренний массив или часть массива.

Длина (length):
Длина slice определяет количество элементов, доступных для работы в slice. Эта длина может изменяться в процессе добавления или удаления элементов.

Ёмкость (capacity):
Ёмкость slice — это максимальное количество элементов, которые могут быть размещены в текущем выделенном массиве без перераспределения памяти.

Когда slice расширяется (например, при добавлении новых элементов), если ёмкость превышена, Go автоматически увеличивает ёмкость, выделяя новый массив и копируя туда элементы старого массива.
😁6👍4
Что происходит, если между пакетами есть циклические зависимости?

Циклические зависимости возникают, когда два или более пакета зависят друг от друга напрямую или косвенно. Например, пакет A импортирует пакет B, а пакет B импортирует обратно пакет A.

Циклические зависимости недопустимы в Go. Компилятор обнаружит их и выдаст ошибку. Это сделано для упрощения структуры кода и предотвращения сложных проблем с порядком инициализации.
👍13😁1🥱1