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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
🏃‍♀️ 40+ каналов, которые должен читать каждый разработчик

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

IT Job Hub | Работа и вакансии в IT — избранные IT-вакансии

Библиотека программиста — новости из мира IT и технологий

Книги для программистов — самые годные книги по любым языкам и стекам

IT-мемы — мемы про жизу айтишника

Proglib Academy — обучение и курсы, чтобы стать топовым специалистом

Азбука айтишника — азы из мира разработки

Библиотека нейросетей — лайфхаки и промпты для разных задач, баттлы нейронок и новости из мира ИИ

Библиотека фронтендера — все о JS, React, Angular и не только

Библиотека мобильного разработчика — лайфхаки и новости из мира Swift и Kotlin

Библиотека хакера — уязвимости, атаки, бэкдоры и как от них защититься

Библиотека тестировщика — самое интересное о том, как крашить код

🦫 Go
Библиотека Go-разработчика
Библиотека задач по Go
Библиотека Go для собеса
Вакансии по Go

#️⃣ C#
Библиотека шарписта
Библиотека задач по C#
Библиотека собеса по C#
Вакансии по C#

🔧 DevOps
Библиотека devops’а
Библиотека задач по DevOps
Библиотека собеса по DevOps
Вакансии по DevOps & SRE

🐘 PHP
Библиотека пхпшника
Библиотека задач по PHP
Библиотека PHP для собеса
Вакансии по PHP, Symfony, Laravel

🐍 Python
Библиотека питониста
Библиотека Python для собеса
Библиотека задач по Python
Вакансии по питону, Django, Flask

☕️ Java
Библиотека джависта
Библиотека задач по Java
Библиотека Java для собеса
Вакансии по Java

📊 Data Science
Библиотека дата-сайентиста
Библиотека задач по Data Science
Библиотека Data Science для собеса
Вакансии по Data Science

🎮 C++
Библиотека C/C++ разработчика
Библиотека задач по C++
Библиотека C++ для собеса
Вакансии по C++

Подписывайтесь на интересные вам каналы и сохраняйте пост в закладки, чтобы не потерять 🔑
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Table-Driven тестирование

Табличное тестирование (table-driven tests)— это популярный подход к написанию тестов, при котором определяется набор тестовых случаев в виде таблицы или слайса структур, а затем каждый случай прогоняется через одну и ту же тестовую логику.

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

CGO_ENABLED — это переменная окружения, которая управляет использованием CGo при компиляции Go-приложений.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💯41
Чем CGO_ENABLED=0 полезен при сборке Go-приложений

Переменная окружения CGO_ENABLED=0 отключает поддержку CGo при компиляции Go-кода. Это означает, что все зависимости компилируются исключительно на чистом Go, без использования C-библиотек.

Если CGO_ENABLED=1, компилятору Go могут понадобиться инструменты и заголовочные файлы C для целевой платформы. С CGO_ENABLED=0 можно без проблем собирать бинарники для других архитектур и ОС.

Отключение CGo позволяет Go-компилятору использовать статическую компоновку, что уменьшает размер бинарного файла и исключает динамические зависимости.

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁2
Как работает система пакетов в Go

В начале каждого .go файла указывается, к какому пакету он принадлежит

Если в коде есть package main, то этот пакет может быть скомпилирован в исполняемый файл. В противном случае это библиотечный пакет.

Пакеты импортируются явно, указывая полный путь.

Ограниченная область видимости

Если идентификатор (переменная, функция, структура) начинается с заглавной буквы, он доступен за пределами пакета.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15😁1🥱1
Как в Go реализовать wildcard импорт

В Go нет wildcard-импортов (import "*"), как в Java или Python.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11👍3🥱2🤔1
Как создать свою кастомную ошибку в Go

1️⃣ Пакет errors позволяет быстро создать новую ошибку

2️⃣ Через fmt.Errorf() с форматированием

3️⃣ Создание кастомного типа ошибки через struct

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102
Как работает errors.Is()

Функция errors.Is(err, target) позволяет проверять цепочку ошибок, включая обёрнутые ошибки.

errors.Is(err, ErrNotFound) сравнивает err с ErrNotFound по значению, поэтому сработает.

Почему err == ErrNotFound не сработает?

• err == ErrNotFound проверяет только точное совпадение указателей.

• Если ошибка была обёрнута (fmt.Errorf("%w", err)), указатель изменился, и == больше не сработает.

• А errors.Is() умеет разбирать цепочку ошибок, поэтому он правильно обработает вложенную ошибку.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
В чем разница между rune и byte

byte и rune — это синонимы типов uint8 и int32:

• byte (аналог uint8) — хранит один байт. Используется для работы с ASCII-символами и []byte.
• rune (аналог int32) — хранит один Unicode-символ, так как некоторые символы занимают больше 1 байта.

Когда использовать

• byte — для ASCII-символов, массивов []byte, работы с файлами
• rune — для Unicode (например, китайские и эмодзи-символы)

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
В чем отличие между буферизированным и небуферизированным каналом с точки зрения синхронизации

Небуферизированный канал: каждый отправитель блокируется, пока получатель не получит данные. Это означает, что операции отправки и получения жёстко синхронизированы.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🥱2
Чем sync.Cond отличается от sync.Mutex

sync.Mutex — примитив блокировки, предотвращает конкурентный доступ к данным. Горутины ждут освобождения мьютекса, но не получают уведомления об изменении состояния.

sync.Cond — механизм ожидания события. Горутины ждут условие (Wait()), а другая горутина будит (Signal() или Broadcast()) их, когда условие меняется.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤩6😁1
Какую роль играет компилятор Go при проверке типов

Компилятор Go выполняет статическую проверку типов до компиляции, что помогает выявить ошибки на раннем этапе. Он проверяет:

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

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

Тип лучше использовать, когда нужен новый тип на основе уже существующего типа, но с дополнительной типовой безопасностью. Например, номер телефона или идентификатор нужно валидировать не как int.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁21
💬 Как оставлять комментарии в чате нашего канала

В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.

⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.

Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.

Как присоединиться к чату, чтобы бот вас не забанил

— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат

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

❗️ Если вас все-таки забанили

— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу

Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.

👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1
Как изменить значение переменной через reflect?

Чтобы изменить значение переменной через reflect в Go, необходимо использовать метод Set(), предоставляемый типом reflect.Value. Однако для того чтобы использовать Set(), нужно убедиться, что передаваемый объект является изменяемым (т.е. является указателем на значение)

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Какие вопросы хотели бы увидеть на следующей неделе

👍🏼Классика: goroutine, channel, interface{} — то, что встречается на каждом собесе
🤔Неочевидные штуки: GC, race detector, pointer escaping — то, что вы не найдёте в туториалах
🔥Вопросы с кодом: разбор реальных кейсов или mini-challenges

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔63🔥29👍25
Как планировщик Go решает, на каком ядре будет выполняться конкретная горутина

В Go планирование горутин не зависит напрямую от операционной системы, а управляется Go-рантаймом, который использует свою собственную модель многозадачности

Go использует модель планирования M:N (M горутин на N потоков). Это означает, что несколько горутин могут быть распределены по нескольким потокам ОС.

В Go есть три ключевых компонента, которые связаны с планированием горутин:

G (goroutine): горутина — поток, который управляется Go-рантаймом. В Go может быть создано много горутин (десятки тысяч и даже миллионы), и они используют системные ресурсы с минимальными затратами.

M (machine): системный поток, который Go использует для выполнения горутин. В операционной системе это обычный поток ОС. В Go обычно количество потоков M ограничено числом доступных ядер процессора.

P (processor): абстракция процессора, которая управляет очередями готовых горутин, которые могут быть исполнены. Каждый процессор может управлять множеством горутин, но горутина будет выполняться только на одном ядре в момент времени.

Go решает, на каком ядре будет выполняться горутина, на основе количества доступных процессоров (runtime.GOMAXPROCS) и текущей загрузки

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

• Использование пула объектов
При часто повторяющихся аллокациях можно использовать пул объектов (sync.Pool). Это позволяет повторно использовать объекты вместо того, чтобы создавать новые каждый раз.

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

• Использование указателей вместо копий
Если возможно, следует использовать указатели
для передачи объектов, а не создавать их копии. Это позволяет избежать дополнительных аллокаций памяти при передаче данных между функциями.

• Использование буферов
Когда работаете с большими объемами данных, можно использовать буферизацию для чтения/записи.

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

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


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


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


Проблемы с инициализацией синглтона
Если синглтон требует сложной инициализации, например, создание нескольких объектов, настройка зависимостей, это может замедлить работу приложения, особенно если инициализация не оптимизирована.


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