Библиотека Go для собеса | вопросы с собеседований @go_interview_lib Channel on Telegram

Библиотека Go для собеса | вопросы с собеседований

@go_interview_lib


Вопросы с собеседований по Go и ответы на них.

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://t.me/proglibrary/9197

Библиотека Go для собеса | вопросы с собеседований (Russian)

Вы хотите успешно сдать собеседование по языку программирования Go? Тогда канал "Библиотека Go для собеса | вопросы с собеседований" (@go_interview_lib) станет вашим надежным помощником! Здесь вы найдете самые актуальные вопросы и их ответы, которые помогут вам подготовиться к собеседованию на высоком уровне.

Не забудьте также ознакомиться с другими нашими каналами: https://t.me/proglibrary/9197
Посетите наш веб-сайт для обучения: https://proglib.io/w/0b524a15

Если у вас есть вопросы или предложения, вы всегда можете обратиться к нашему боту обратной связи: @proglibrary_feedback_bot.

Для информации о рекламе на наших каналах обращайтесь к @proglib_adv. Подробный прайс можно узнать у @proglib_advertising. Не упустите возможности улучшить свои навыки и успешно пройти собеседование благодаря каналу "Библиотека Go для собеса | вопросы с собеседований"!

Библиотека Go для собеса | вопросы с собеседований

23 Jan, 13:02


Что такое импортируемый и исполняемый пакеты?

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

Библиотека Go для собеса | вопросы с собеседований

22 Jan, 15:04


Хочешь уверенно проходить IT-интервью?

Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.

💡 Почему Т1 тренажёр — это мастхэв?

• Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше.
• Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
• Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.

Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!

Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy

#Айти #Собеседование #Т1

Библиотека Go для собеса | вопросы с собеседований

22 Jan, 07:04


Что такое ABA-проблема в контексте Compare and Swap операций?

ABA-проблема — это ситуация, которая возникает при использовании операции Compare-And-Swap (CAS) в многопоточном программировании. Она связана с тем, что значение переменной изменяется с A на B, а затем снова на A. CAS не может определить, что значение изменялось между этими состояниями, и считает, что оно не изменилось.

Библиотека Go для собеса | вопросы с собеседований

21 Jan, 07:03


Какие механизмы используются для предотвращения бесконечных повторных попыток (spinlocks) в Lock-Free алгоритмах?

Для предотвращения бесконечных попыток используются:
Экспоненциальный бэкофф: поток ждёт случайный интервал времени перед следующей попыткой CAS, постепенно увеличивая задержку. Это снижает нагрузку на процессор.
Адаптивные алгоритмы: используют метрики системы, такие как нагрузка на процессор, чтобы регулировать поведение потоков.
Алгоритмы с ограничением времени ожидания (timed wait): если после определённого количества попыток CAS не удаётся, поток может прекратить выполнение или использовать fallback-метод.
Смешанный подход (Hybrid Locking): Использование мьютексов или других методов синхронизации как резервного механизма, если CAS не удаётся.

Библиотека Go для собеса | вопросы с собеседований

20 Jan, 11:07


Способы борьбы с трэшингом

Увеличение размера кэша: выделить больше памяти для хранения данных.

Оптимизация алгоритма замещения: использовать эффективные алгоритмы, такие как:
LRU (Least Recently Used): замещает данные, которые не использовались дольше всего.
LFU (Least Frequently Used): удаляет данные, которые реже всего запрашиваются.

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

Фильтрация данных: исключить из кэша редко запрашиваемую или устаревшую информацию.

Многоуровневое кэширование: организовать кэширование на нескольких уровнях:
Локальный кэш (в памяти приложения).
Распределённый кэш (например, Redis, Memcached).

Предварительное заполнение кэша: использовать pre-warming для загрузки часто запрашиваемых данных при запуске системы.

Библиотека Go для собеса | вопросы с собеседований

20 Jan, 07:06


Что такое трэшинг? (В контексте кэширования)

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

Библиотека Go для собеса | вопросы с собеседований

19 Jan, 07:05


Чем отличаются Lock-Free и Wait-Free алгоритмы?

Lock-Free алгоритмы:

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

Wait-Free алгоритмы:
Гарантируют, что каждый поток завершит операцию за конечное время.
Обычно сложнее в реализации и менее производительны из-за необходимости более сложной координации между потоками.
Используются там, где важно обеспечить равноправие (fairness).

Библиотека Go для собеса | вопросы с собеседований

18 Jan, 07:02


Что такое «кеш-пробивка» (cache penetration) и как с этим бороться?

Кеш-пробивка — это ситуация, когда запросы приходят на данные, которых нет в кеше и никогда не будет, например, для несуществующих идентификаторов. Такие запросы всегда попадают в базу данных, перегружая ее.

Как с этим бороться?

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

Блокировка запросов: использовать блокировку (mutex), чтобы один поток обрабатывал запрос, а остальные ждали результат.

Предварительная фильтрация: проверять валидность запросов до обращения к кешу.

Библиотека Go для собеса | вопросы с собеседований

17 Jan, 13:00


Что такое Compare-And-Swap (CAS)?

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

Библиотека Go для собеса | вопросы с собеседований

16 Jan, 07:06


Как избежать проблем с устаревшими данными в кэше?

Для предотвращения устаревания данных в кеше можно использовать следующие подходы:
TTL (Time-To-Live): Устанавливать срок жизни данных, после чего они автоматически удаляются.
Invalidate on Write: Удалять или обновлять кеш при изменении данных в источнике.
Background Refresh: Периодически обновлять данные в кеше с помощью фонового процесса.
Cache Busting: Использовать версионирование ключей кеша, чтобы автоматически использовать актуальные данные.

Библиотека Go для собеса | вопросы с собеседований

15 Jan, 15:00


Какой порядок перебора элементов в map?

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

Почему так?

Использование хэш-таблицы:

Внутренне map реализована как хэш-таблица.
Позиция каждого элемента определяется хэш-значением ключа. Хэш-функция распределяет данные по бакетам, и порядок их расположения не сохраняется.

Случайный seed:

При запуске программы Go устанавливает случайный seed для хэш-функции. Это означает, что даже для одной и той же структуры данных порядок обхода map может различаться между разными запусками программы.

Библиотека Go для собеса | вопросы с собеседований

15 Jan, 06:02


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

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ

Библиотека Go для собеса | вопросы с собеседований

14 Jan, 15:00


Что такое холодный и тёплый кэш?

Холодный кэш — это состояние кэша, когда он только начинает наполняться данными. В этом случае при запросе данных часто приходится обращаться к источнику (например, базе данных), так как кэш ещё не заполнен.

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

Библиотека Go для собеса | вопросы с собеседований

13 Jan, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

12 Jan, 20:59


Что конкретно проверяет Escape Analysis?

Go выполняет анализ утечки во время компиляции. Компилятор проверяет, может ли ссылка на переменную:

Возвращаться из функции.
Использоваться в других goroutines.
Передаваться в функцию, которая сохраняет её для последующего использования.

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

Библиотека Go для собеса | вопросы с собеседований

12 Jan, 19:00


Что такое Escape Analysis?

Escape Analysis (анализ утечки) — это процесс, который компилятор Go использует, чтобы определить, где должны быть размещены переменные: в стеке или в куче.

⚙️ Если переменная не «выходит» за пределы области видимости функции, компилятор размещает её в стеке. Это быстрее и дешевле, поскольку стек управляется автоматически, и память освобождается при выходе из функции.
⚙️ Если переменная выходит за пределы области видимости функции, она размещается в куче. Это необходимо, чтобы гарантировать её доступность в других частях программы, но работа с кучей более затратна (например, требуется garbage collector).

Библиотека Go для собеса | вопросы с собеседований

11 Jan, 18:36


Представьте, что вы часто используете go run для запуска скриптов, но со временем замечаете, что дисковое пространство начинает уменьшаться из-за накопленного кэша. Какой командой можно очистить кэш, связанный с go run, и что именно будет удалено?

Кэш для go run, как и другие данные сборки, управляется через стандартный кэш Go. Чтобы очистить кэш, можно использовать команду:
go clean -cache

Это удалит все закэшированные данные, включая кэш для go run, освобождая место на диске.

Библиотека Go для собеса | вопросы с собеседований

11 Jan, 18:22


В Go 1.24 представлено обновление кэширования для команды go run. Объясните, как работает это кэширование, какие преимущества оно даёт и в каких ситуациях может быть полезным.

В Go 1.24 исполняемые файлы, созданные командой go run, теперь кэшируются. При повторном выполнении go run с теми же исходными файлами и зависимостями Go использует уже скомпилированный файл из кэша, вместо того чтобы повторно компилировать код. Это значительно ускоряет выполнение команды, особенно для крупных проектов.

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

Сценарии, где это полезно:
Частый запуск скриптов для тестирования изменений.
Использование go run для небольших утилит или прототипов.
Повторное выполнение кода с неизменёнными входными данными.

Библиотека Go для собеса | вопросы с собеседований

08 Jan, 13:02


Что делает инструмент go vet?

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

Библиотека Go для собеса | вопросы с собеседований

06 Jan, 13:06


Что такое пакет embed в Go, и когда его стоит использовать?

Пакет embed позволяет встраивать файлы в исполняемый бинарник, что полезно для создания автономных приложений, где важно, чтобы все ресурсы (например, конфигурационные файлы или статические данные) были в одном файле. Он особенно полезен для серверов или CLI-инструментов, где важно избежать зависимости от внешних файлов.

Библиотека Go для собеса | вопросы с собеседований

06 Jan, 13:00


Что делает функция runtime.GC()?

Функция runtime.GC() инициирует принудительную сборку мусора.
1. Выполняет полный цикл сборки мусора (включая STW).
2. Полезна для тестирования или контроля состояния памяти (например, измерения выделений памяти).

Примечание: использование runtime.GC() в продакшене не рекомендуется, так как оно нарушает автоматическое управление памятью.

Библиотека Go для собеса | вопросы с собеседований

05 Jan, 10:59


🤨В каких случаях лучше использовать sync.Pool?

sync.Pool подходит для повторного использования объектов, которые:

Имеют короткий срок жизни.
Часто создаются и освобождаются.
Не требуют постоянного хранения в памяти.

Примеры:
Буферы для обработки данных.
Временные структуры, используемые в алгоритмах.
Часто используемые небольшие объекты (например, []byte).

Важно: объекты из sync.Pool могут быть очищены сборщиком мусора, если память ограничена.

Библиотека Go для собеса | вопросы с собеседований

04 Jan, 13:01


Что такое sync.Pool?

sync.Pool — это потокобезопасная структура для повторного использования временных объектов. Она помогает уменьшить нагрузку на GC, избегая частого выделения и освобождения памяти. Если пул пуст, может создать новый объект через функцию New. Подходит для объектов с коротким сроком жизни, например, буферов. Объекты в пуле не гарантированно сохраняются, так как могут быть очищены GC при недостатке памяти.

Библиотека Go для собеса | вопросы с собеседований

03 Jan, 15:20


🎄 Начни 2025-й с апгрейдом навыков,
которые откроют двери в мир IT!

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

🔗 Собери свой план и начни путь в IT

Почему это выгодно?

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

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

💸 Знания, которые окупятся — навыки, востребованные в любой точке мира.
Какие навыки ты можешь прокачать?

💡 Математика для Data Science + Алгоритмы и структуры данных
— Подготовка к собеседованиям в FAANG и поступлению в ШАД. Решай сложные задачи, работай с данными и моделями на профессиональном уровне.

💡 Алгоритмы и структуры данных + ML
— Улучшай своё алгоритмическое мышление и изучай базовые методы машинного обучения, чтобы создавать интеллектуальные приложения.

💡 Frontend Basic + Базовые модели ML
— Построй свою первую веб-страницу и погрузись в мир ML: от нейросетей до ML-бустинга.

💡 Архитектуры и шаблоны проектирования + Математика для Data Science
— Развивай аналитическое мышление и учись проектировать устойчивые системы.

💡 Алгоритмы и структуры данных + Frontend Basic
— Получи полный набор навыков: от оптимизации алгоритмов до создания современных веб-приложений.

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

🔗 Составь свой IT-маршрут сейчас или выбери курс по новогодней скидке

Библиотека Go для собеса | вопросы с собеседований

03 Jan, 10:59


Что такое GOGC?

GOGC (Garbage Collection Goal) — это переменная окружения или настройка, управляющая частотой работы сборщика мусора в Go. GOGC определяет процентный прирост памяти, который допускается перед запуском очередного цикла GC.

Значение GOGC:
100 (по умолчанию): GC запускается, когда используемая память увеличивается на 100% по сравнению с памятью, оставшейся после последнего цикла GC.
0: отключает автоматическую сборку мусора.
<100: увеличивает частоту работы GC (более агрессивная сборка).
>100: снижает частоту работы GC (редкие сборки).

Библиотека Go для собеса | вопросы с собеседований

02 Jan, 12:59


Чем отличается память в куче от памяти в стеке?

Память в стеке:
Используется для хранения данных с коротким временем жизни (локальные переменные функции).
Быстро выделяется и освобождается, поскольку происходит по принципу LIFO (Last-In-First-Out).
Управляется автоматически при выходе из области видимости функции.
Ограничена по размеру.

Память в куче:
Используется для объектов, срок жизни которых не определён заранее.
Выделение и освобождение сложнее и медленнее, так как управляется сборщиком мусора (GC).
Не ограничена жёсткими рамками, зависит от доступной оперативной памяти.
Подходит для глобальных и длительно живущих объектов.

Библиотека Go для собеса | вопросы с собеседований

01 Jan, 13:00


Можно ли модифицировать map внутри цикла range? Почему?

Нет, модифицировать map во время итерации через range в Go нельзя, так как это может привести к панике (runtime panic). В документации языка указано, что параллельное изменение карты во время итерации не допускается, поскольку внутренняя структура map в Go не поддерживает такие операции.

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

Библиотека Go для собеса | вопросы с собеседований

31 Dec, 13:00


Как проверить, пуст ли интерфейс (interface{})?

Интерфейс (interface{}) в Go считается пустым, только если его значение и тип равны nil. Для точной проверки можно использовать reflect.ValueOf(i).IsZero(), чтобы учесть случаи с nil-значением, но заданным типом.

📎 Подробнее можно почитать здесь

Библиотека Go для собеса | вопросы с собеседований

30 Dec, 20:03


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

30 Dec, 13:00


Что произойдет, если в defer использовать анонимную функцию, изменяющую внешнюю переменную?

Изменения произойдут в момент выполнения отложенной функции (а не в момент ее определения)

Библиотека Go для собеса | вопросы с собеседований

30 Dec, 10:45


🗺 Привычка "срезать углы" при ходьбе – это интуитивное применение алгоритмов?

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

С нашим курсом «Алгоритмы и структуры данных» вы научитесь решать любые сложные задачи так же эффективно.

🎄Начните свой 2025 со скидкой 35% на все курсы. Это лучшее вложении уходящего года – https://proglib.io/w/014fe6d8

Библиотека Go для собеса | вопросы с собеседований

30 Dec, 08:34


🎨 Новый канал для вдохновения — UX in GIF

Мы запустили свежий канал, где делимся идеями для дизайна интерфейсов. Всё самое стильное, оригинальное и вдохновляющее теперь в одном месте.

📌 Чем полезен канал?

→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.

👉 Подписывайтесь и вдохновляйтесь: UX in GIF

Библиотека Go для собеса | вопросы с собеседований

28 Dec, 16:00


В каких случаях деление на ноль в языке Go не приводит к панике (panic), и какой результат возвращается в этих случаях?

Деление на ноль в Go не приводит к панике в случаях, когда используются числа с плавающей запятой (float64). В зависимости от знака делимого, результат будет:
Положительное число делится на ноль: результатом будет положительная бесконечность (+Inf).
Отрицательное число делится на ноль: результатом будет отрицательная бесконечность (-Inf).
Ноль делится на ноль: результатом будет «not-a-number» (NaN).

Библиотека Go для собеса | вопросы с собеседований

27 Dec, 11:01


Может ли одна горутина заблокировать мьютекс, а другая его разблокировать?

Мьютексы в Go не отслеживают, какая конкретно горутина вызвала Lock или Unlock. Это означает, что мьютекс может быть заблокирован одной горутиной и разблокирован другой. Такое поведение допускается на уровне реализации, чтобы мьютексы были максимально простыми и эффективными.
Однако это крайне не рекомендуется, так как приводит к сложностям в управлении состоянием мьютекса и повышает риск возникновения ошибок.

Библиотека Go для собеса | вопросы с собеседований

26 Dec, 11:04


Что такое «магическая дата» в Go?

«Магическая дата» в Go — это фиксированная дата и время: 2006-01-02 15:04:05, выбранная для демонстрации форматов даты и времени. Она служит эталоном для указания шаблонов при работе с функциями форматирования и парсинга времени.

Почему выбрана именно эта дата?
Go использует числовую комбинацию, отражающую порядок элементов даты и времени:
2006 — год, состоящий из 4 цифр.
01 — месяц.
02 — день.
15 — часы в 24-часовом формате.
04 — минуты.
05 — секунды.

Из этой даты получается набор цифр — 1,2,3,4,5,6

Библиотека Go для собеса | вопросы с собеседований

25 Dec, 11:01


Как работает iota в случае переопределения значений

const (
A = iota // 0
B = «Hello» // Переопределение строки
C = iota // 2 (счёт продолжается)
D = 100 // Явное значение
E = iota // 4
)

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

Библиотека Go для собеса | вопросы с собеседований

24 Dec, 11:02


Что такое iota и как он работает в Go?

iota — это встроенный идентификатор, используемый для генерации последовательных числовых значений внутри блока const. Он начинается с 0 и увеличивается на 1 с каждой строкой

Библиотека Go для собеса | вопросы с собеседований

23 Dec, 18:01


🤨 Как сравнить два слайса в Go?
В Go для сравнения двух слайсов нужно вручную или с помощью готовых решений проверить их содержимое, так как оператор == не поддерживает сравнение слайсов

1️⃣ Через циклы
func slicesEqual(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}


2️⃣ Библиотека reflect
import "reflect"

func slicesEqual(a, b []int) bool {
return reflect.DeepEqual(a, b)
}


3️⃣Использование cmp из google/go-cmp
Для более сложных сравнений, например, со структурой или кастомными правилами:
import (
"fmt"
"github.com/google/go-cmp/cmp"
)

func main() {
slice1 := []int{1, 2, 3}
slice2 := []int{1, 2, 3}

fmt.Println(cmp.Equal(slice1, slice2)) // true
}


4️⃣Сравнение через сериализацию (для сложных данных)
import (
"encoding/json"
"log"
)

func slicesEqualJSON(a, b []int) bool {
aJSON, _ := json.Marshal(a)
bJSON, _ := json.Marshal(b)
return string(aJSON) == string(bJSON)
}

Библиотека Go для собеса | вопросы с собеседований

23 Dec, 15:01


🌟 Хочешь писать код, который решает конкурентные задачи без багов? Начни с каналов в Go. Разберём устройство и применение на практике.

🗓 Открытый урок уже 25 декабря! Не упусти шанс наконец-то сделать свой код лучше.

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

👨‍💻 Вебинар для Golang-разработчиков — и новичков, и практиков. Регистрируйся, если не хочешь стоять на месте: https://clck.ru/3FJCGG

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Библиотека Go для собеса | вопросы с собеседований

22 Dec, 11:05


Почему в Go функции всегда возвращают error, даже если оно равно nil?

В Go функции всегда возвращают error, чтобы обеспечить явную обработку ошибок. Даже если error == nil, его наличие заставляет разработчика проверить результат выполнения. Это делает код предсказуемым, читабельным и снижает вероятность игнорирования ошибок, сохраняя простоту интерфейса и гибкость дизайна функций.

Библиотека Go для собеса | вопросы с собеседований

21 Dec, 11:01


Что делает функция io.TeeReader? Приведите примеры использования

Функция io.TeeReader из пакета io создаёт Reader, который выполняет двойную работу:
1️⃣ Читает данные из исходного io.Reader.
2️⃣ Одновременно записывает эти данные в заданный io.Writer.

Иными словами, она «разветвляет» поток данных: каждый байт, который читается, также записывается в другой поток, указанный через io.Writer.

Где может быть полезен io.TeeReader?

Логирование данных:
Когда нужно сохранять или анализировать данные, одновременно читая их.
Например, записывать HTTP-запросы или ответы в лог, не прерывая основной процесс обработки.

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

Создание копий данных:
Например, при загрузке файла вы можете сохранить копию на диск и одновременно передать её в сетевой поток.

Диагностика и отладка:
Можно использовать TeeReader для перехвата и анализа данных в реальном времени.

Библиотека Go для собеса | вопросы с собеседований

20 Dec, 09:01


Новый год — время для новых начинаний!
Пока все строят планы на будущее, подумайте, что поможет вам двигаться вперёд в карьере. Мы знаем, что навыки в IT открывают огромные возможности — и мы готовы помочь вам начать!

🔹 Почему IT?

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

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

📚 Как это работает?

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

А для тех, кто решит сделать шаг в будущее до конца года, у нас есть кое-что особенное… 🎁 Узнайте больше

Как выбрать свой путь?
Мы предлагаем несколько уникальных комбинаций курсов, которые помогут вам стать настоящим экспертом:

🔵 Математика для Data Science + Алгоритмы и структуры данных — для тех, кто хочет готовиться к собеседованиям в топовые компании.

🔵 Алгоритмы + ML — чтобы не просто решать задачи, а понимать, как работают современные технологии.

🔵 Frontend + ML — создавайте приложения и учитесь работать с нейросетями.

🔵 И другие комбинации для разных целей.

Новогодний подарок, который будет работать на вас весь год — это отличная идея! 🎁 Начните сейчас

Развивайтесь в IT — и будущее уже будет в ваших руках!

Библиотека Go для собеса | вопросы с собеседований

20 Dec, 07:07


Как работать с временно неиспользуемыми переменными?

Если переменная временно не используется, её можно явно игнорировать с помощью _ (пустого идентификатора). Это указывает на то, что разработчик осознанно отказывается от значения.

Библиотека Go для собеса | вопросы с собеседований

19 Dec, 11:05


Чем отличаются crypto/rand и math/rand? Когда использовать каждый из них?

Цель и применение:
crypto/rand: Предназначен для генерации криптографически стойких случайных чисел. Используется в задачах, связанных с безопасностью, где важно исключить возможность предсказания результата.
math/rand: Предоставляет генератор псевдослучайных чисел, который быстрее, но менее стойкий к предсказанию. Используется в сценариях, где безопасность не критична, например, для симуляций, тестов или игровых алгоритмов.

Генератор случайных чисел:
⚙️ crypto/rand: Использует системный источник случайности (например, /dev/urandom в Linux или CryptGenRandom в Windows). Это делает его надежным, но медленным.
⚙️ math/rand: Использует алгоритм генерации псевдослучайных чисел, который основывается на фиксированном начальном значении (seed). Повторение одинакового сида приводит к генерации одинаковой последовательности чисел.

Предсказуемость:
⚙️ crypto/rand: Случайные числа практически невозможно предсказать.
⚙️ math/rand: Если известен seed, последовательность чисел легко воспроизвести.

Библиотека Go для собеса | вопросы с собеседований

18 Dec, 12:59


Как работает sync.WaitGroup?

1️⃣ Создаётся экземпляр sync.WaitGroup, который отслеживает количество горутин.
2️⃣ Перед запуском горутин вызывается метод Add(n), где n — количество горутин, которые нужно отследить.
3️⃣ Внутри каждой горутины вызывается метод Done(), который уменьшает счётчик WaitGroup на 1 после завершения работы.
4️⃣ Основной поток вызывает метод Wait(), который блокируется до тех пор, пока счётчик не станет равным нулю.

Библиотека Go для собеса | вопросы с собеседований

18 Dec, 12:29


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

Для ожидания завершения нескольких горутин и продолжения выполнения основного потока в Go можно использовать sync.WaitGroup. Этот инструмент позволяет координировать выполнение горутин и гарантировать, что основной поток дождётся завершения всех задач.

Библиотека Go для собеса | вопросы с собеседований

17 Dec, 18:05


🦫 Самоучитель по Go для начинающих. Часть 18. Протокол HTTP. Создание HTTP-сервера и клиента. Пакет net/http

Погружаемся в мир сетевых технологий с Go! В этой части самоучителя рассматриваются основы работы с HTTP в Go: устройство HTTP-запросов и ответов, ключевые способы взаимодействия клиента и сервера. Также подробно разбираются возможности пакета net/http, включая отправку запросов, обработку ответов и настройку параметров HTTP-сервера для веб-приложений.

📎 Читать новую часть самоучителя

Библиотека Go для собеса | вопросы с собеседований

17 Dec, 07:43


Что выведет следующий код и почему?
package main

import "fmt"

func main() {
i := 0
defer fmt.Println("Result:", i)
i++
}

Выведется 0, потому что defer захватывает значение переменных на момент объявления, а не на момент выполнения отложенной функции.

Библиотека Go для собеса | вопросы с собеседований

16 Dec, 20:04


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

16 Dec, 13:00


Что будет, если использовать пакет из _ импорта?

Если попытаться использовать функции, переменные или типы из пакета, который импортирован с помощью _, это вызовет ошибку компиляции.
Пустой идентификатор (_) означает, что пакет подключён исключительно для выполнения побочных эффектов (например, init()). Сам пакет становится «неактивным» для остального кода программы.

Библиотека Go для собеса | вопросы с собеседований

15 Dec, 13:00


Что делает _ — импорт?

В Go _-импорт используется для подключения пакета только ради выполнения его побочных эффектов (например, функций init()) без дальнейшего использования самого пакета в коде.

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

Библиотека Go для собеса | вопросы с собеседований

15 Dec, 06:01


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

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ

Библиотека Go для собеса | вопросы с собеседований

14 Dec, 13:01


Что происходит, если между пакетами есть циклические зависимости?

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

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

Библиотека Go для собеса | вопросы с собеседований

13 Dec, 13:00


Как slice устроен под капотом?

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

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

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

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

Когда slice расширяется (например, при добавлении новых элементов), если ёмкость превышена, Go автоматически увеличивает ёмкость, выделяя новый массив и копируя туда элементы старого массива.

Библиотека Go для собеса | вопросы с собеседований

13 Dec, 07:02


💾 CDC vs Outbox: как решить проблему двойной записи в распределенной системе

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

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

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

🔗 Читать статью
🔗 Зеркало

Библиотека Go для собеса | вопросы с собеседований

04 Dec, 11:02


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

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

Библиотека Go для собеса | вопросы с собеседований

04 Dec, 07:06


📈 Кадровый голод в IT: почему компании готовы платить на 13% больше

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

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

📎 Читать статью

Библиотека Go для собеса | вопросы с собеседований

03 Dec, 18:06


Как справляться с проблемой «fan-in» и «fan-out» в Go?

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

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

Библиотека Go для собеса | вопросы с собеседований

02 Dec, 20:03


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

02 Dec, 18:05


Почему в проектах на Go разработчики часто предпочитают использовать сторонние библиотеки для логирования, такие как zap или logrus, вместо стандартного пакета log?

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

Это особенно полезно для автоматической обработки логов в системах мониторинга, таких как ELK или Loki.
Стандартный пакет чаще всего используется для простых скриптов и CLI-приложений. Для высоконагруженных, сложных или больших приложений лучшим выбором будут сторонние библиотеки.

Библиотека Go для собеса | вопросы с собеседований

01 Dec, 18:08


В чем отличие между каналами, которые буферизуются, и небуферизованными каналами в Go?

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

Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.

Библиотека Go для собеса | вопросы с собеседований

30 Nov, 11:05


Что такое nil ошибка в Go и как её правильно обрабатывать?

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

Библиотека Go для собеса | вопросы с собеседований

29 Nov, 11:01


Что такое пустой интерфейс в Go? Когда его лучше использовать и когда не стоит?

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

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

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

Библиотека Go для собеса | вопросы с собеседований

28 Nov, 18:06


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

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

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

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

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

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

Библиотека Go для собеса | вопросы с собеседований

28 Nov, 13:54


🎉 Розыгрыш от Proglib Academy и DigitalRazor!

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

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

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

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

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

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

Выбрать курс

Библиотека Go для собеса | вопросы с собеседований

27 Nov, 13:43


Как форматировать исходный код на Go идиоматично?

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

🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.

Библиотека Go для собеса | вопросы с собеседований

27 Nov, 12:12


⚡️ Напоминаем: у нас можно (и нужно) купить рекламу

→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения

Для заказа пишите сюда: @proglib_adv

Библиотека Go для собеса | вопросы с собеседований

26 Nov, 18:05


Как используется оператор select в Go?

Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала).

🛠 select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.

Библиотека Go для собеса | вопросы с собеседований

26 Nov, 11:18


Лучшие ресурсы, чтобы не отставать от трендов из мира Go.

👣 Golang Go - авторский канал, посвященный Go разработке, Devops и созданию высоконагруженных сервисов.

📚 Golang books — редкая литература , статьи, курсы и уникальные гайды для Golang специалистов любого уровня. Читайте, развивайтесь, практикуйте.

💼 Golang Jobs — актуальные предложения для Golang разработчиков от самых крупных работодателей и лидеров рынка.

Библиотека Go для собеса | вопросы с собеседований

25 Nov, 15:21


Черные скидки на курсы в Академии!

-40% до конца ноября

🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)

🎁 Анонс новогоднего сюрприза!

🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!

Почему стоит выбрать нас?

⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.

⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.

⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.

👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –

Ждем вас на обучении! 🙌

Библиотека Go для собеса | вопросы с собеседований

25 Nov, 07:09


Как избежать состояния гонки?

Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}


Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}

Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}

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

Используйте инструменты для обнаружения состояния гонки:
Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go


Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.

Библиотека Go для собеса | вопросы с собеседований

23 Nov, 20:47


💬 Почему добавление элементов в nil-срез работает, а добавление в nil-мапу вызывает панику?

В Go срезы и тип map работают по-разному:

1. Срезы:
🔸 nil-срез — это валидный срез с нулевой длиной (len == 0) и нулевой ёмкостью (cap == 0).
🔸 Когда мы вызываем append() на nil-срезе, Go выделяет новую память и создаёт срез с достаточной ёмкостью для хранения новых элементов. Поэтому добавление элементов в nil-срез работает без ошибок.

Пример:
var a []int
a = append(a, 4, 5, 6) // Создаётся новый срез в памяти
fmt.Println(a) // [4 5 6]


2. Тип map
🔸 nil-мапа неинициализирована и не имеет памяти для хранения пар ключ-значение.
🔸 Любая попытка добавить элемент в nil-мапу вызовет панику, так как мапа не готова к использованию.
🔸 Для работы с мапой её нужно явно инициализировать с помощью функции make.

Пример:
var m map[int]int
// m[1] = 1 // Вызовет панику
m = make(map[int]int)
m[1] = 1 // Теперь работает

Библиотека Go для собеса | вопросы с собеседований

22 Nov, 20:42


👨‍💻🚀 Тест: насколько ты продвинутый разраб?

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

👉 Ворваться

Библиотека Go для собеса | вопросы с собеседований

21 Nov, 20:56


🦫 Самоучитель по Go для начинающих. Часть 17. Основы сетевого программирования. Стек TCP/IP. Сокеты. Пакет net

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

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

👉 Читать гайд

👩‍💻 Остальные части в серии:

1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
12. Обобщенное программирование. Дженерики
13. Работа с датой и временем. Пакет time
14. Интерфейсы ввода-вывода. Буферизация. Работа с файлами. Пакеты io, bufio, os
15. Конкурентность. Горутины. Каналы
16. Тестирование кода и его виды. Table-driven подход. Параллельные тесты

Библиотека Go для собеса | вопросы с собеседований

20 Nov, 19:39


💬 Почему копирование структур в Go может привести к неожиданным результатам? Приведите пример.

Копирование структур может быть проблематичным, если структура содержит указатели или срезы, которые при копировании продолжают ссылаться на ту же область памяти, что и оригинал. Например, структура bytes.Buffer содержит срез []byte. Если скопировать объект Buffer, методы, вызванные на копии, могут изменять данные в оригинале, так как оба объекта используют одну и ту же память.

package main

import (
"bytes"
"fmt"
)

func main() {
// Создаем оригинальный буфер
original := bytes.Buffer{}
original.WriteString("Hello")

// Копируем буфер
copyBuffer := original

// Добавляем данные в копию
copyBuffer.WriteString(", World!")

// Проверяем содержимое оригинала
fmt.Println(original.String()) // Вывод: "Hello, World!"
}


В этом примере срез []byte в копии copyBuffer ссылается на тот же массив, что и в оригинале original. Поэтому изменения в одном буфере затрагивают другой.

Библиотека Go для собеса | вопросы с собеседований

19 Nov, 18:40


🤔🎄🎁 Какой подарок вы бы хотели на Новый год?

Да, начинать готовиться никогда не рано 😉

#интерактив

Библиотека Go для собеса | вопросы с собеседований

18 Nov, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

17 Nov, 20:43


💬 Какой подход лучше использовать для объявления пустого среза в Go и почему?

Предпочтительнее использовать var t []string вместо t := []string{}. Первый вариант объявляет срез как nil, в то время как второй вариант создаёт не-nil срез нулевой длины. Они функционально эквивалентны — их len и cap равны нулю, — но стиль с nil-срезом считается предпочтительным.

Важно учитывать, что есть ситуации, когда предпочтителен не-nil срез с нулевой длиной. Например, при кодировании JSON: nil-срез кодируется как null, а []string{} — как пустой JSON-массив [].

Библиотека Go для собеса | вопросы с собеседований

16 Nov, 20:43


💬 Почему для генерации ключей в Go нельзя использовать math/rand, и как правильно сгенерировать безопасный ключ?

1. Без явного вызова rand.Seed() генератор math/rand всегда возвращает одну и ту же последовательность чисел.
2. Если использовать time.Now().UnixNano() как seed, доступно всего несколько бит энтропии, что делает последовательности легко предсказуемыми.
3. math/rand не подходит для криптографических задач, так как его алгоритм детерминированный и может быть взломан.

crypto/rand Reader — альтернативный вараинт , а если нам нужен текст, можно вывести его в шестнадцатеричном формате или в формате base64:

import (
"crypto/rand"
// "encoding/base64"
// "encoding/hex"
"fmt"
)

func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err) // out of randomness, should never happen
}
return fmt.Sprintf("%x", buf)
// or hex.EncodeToString(buf)
// or base64.StdEncoding.EncodeToString(buf)
}

Библиотека Go для собеса | вопросы с собеседований

15 Nov, 19:59


💬 Как интерфейс io.WriterTo оптимизирует передачу данных в Go и как io.Copy() решает, какой метод использовать?

Интерфейс io.WriterTo позволяет объекту-источнику напрямую записывать данные в объект-получатель через метод WriteTo(w Writer). Это устраняет необходимость промежуточного буфера, делая передачу данных более эффективной.

io.Copy() проверяет, реализует ли объект-источник интерфейс WriterTo или объект-получатель интерфейс ReaderFrom:
🔸 Если источник реализует WriterTo, вызывается WriteTo().
🔸 Если получатель реализует ReaderFrom, вызывается ReadFrom().
🔸 Если ни один из интерфейсов не реализован, используется внутренний буфер (по умолчанию 32 КБ).

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

Библиотека Go для собеса | вопросы с собеседований

15 Nov, 06:03


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

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ

Библиотека Go для собеса | вопросы с собеседований

12 Nov, 20:35


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

Функция json.Unmarshal при декодировании JSON-сообщений в структуру Go сначала пытается найти точное совпадение ключа. Если точное совпадение не найдено, она принимает ключи, совпадающие с именем поля структуры без учёта регистра.

Если в JSON присутствуют несколько ключей, которые отличаются только регистром, json.Unmarshal выберет последнее упомянутое значение с учётом регистра. Например, если в JSON имеются ключи "HTML" и "html", то при декодировании в поле HTML структуры будет записано значение из последнего из них.

В приведённом ниже коде JSON содержит два ключа "HTML" и "html" с разными значениями, но функция Unmarshal записывает значение из последнего ключа ("bar") в поле HTML структуры:

package main

import (
"encoding/json"
"fmt"
)

type T struct {
HTML string `json:"HTML"`
}

var s = `{"HTML": "foo", "html": "bar"}`

func main() {
var t T
if err := json.Unmarshal([]byte(s), &t); err != nil {
fmt.Println(err)
return
}
fmt.Println(t.HTML) // bar
}


Таким образом, при наличии нескольких ключей с одинаковым именем, но разным регистром, json.Unmarshal предпочтёт последнее значение.

Библиотека Go для собеса | вопросы с собеседований

11 Nov, 20:13


💬 Какой способ лучше использовать в Go для проверки пустой строки: s != "" или len(s) == 0? В чем разница между этими подходами?

Оба способа корректны и часто используются в Go. Однако предпочтительнее использовать s != "", так как это делает код более читаемым и сразу показывает, что s — это строка.

Использование len(s) == 0 также работает, но это более универсальный способ, который подходит для проверки пустоты слайсов, мап и других типов данных, поэтому может быть менее очевидно, что s — строка.

Библиотека Go для собеса | вопросы с собеседований

10 Nov, 19:32


🔀 Команды git merge и git rebase: преимущества, недостатки и ключевые различия

Один из ключевых аспектов работы с системой контроля версий Git — перенос изменений из одной ветки в другую. Для этого существует два основных инструмента: git merge и git rebase.

Хотя они решают одну и ту же задачу по интеграции кода, делают они это разными способами. Разберемся, как именно работают git merge и git rebase, и какую опцию стоит выбрать в конкретной ситуации.

🔗 Читать статью
🔗 Зеркало

Библиотека Go для собеса | вопросы с собеседований

10 Nov, 14:25


💬 Какие ограничения у традиционного механизма TCP Keepalive в современной архитектуре и как работает Keepalive в контексте межсервисного взаимодействия?

Традиционный механизм TCP Keepalive работает на 4-м уровне модели OSI и позволяет двум узлам поддерживать активное соединение, периодически отправляя друг другу сигналы. Когда узел получает такой сигнал (keepalive probe), он отвечает сообщением ACK, подтверждая свою доступность. Если ответ не приходит в течение заданного времени, узел предполагает, что соединение потеряно. Это эффективно в традиционных сетях.

Однако в современной архитектуре с использованием виртуализации, контейнеризации и прокси-серверов механизм TCP Keepalive имеет ограничение. Он проверяет состояние ближайшего посредника (например, прокси), а не конечного узла, что делает его ненадёжным для сложных сетей. В такой ситуации TCP Keepalive необходимо настраивать на каждом уровне (клиент, прокси и сервер) для гарантии доступности конечного узла.

👉 Подробнее

Библиотека Go для собеса | вопросы с собеседований

09 Nov, 15:40


💬 В Go есть функция runtime.SetFinalizer, позволяющая привязать финализатор к объекту. Как она работает и в каких случаях использование финализаторов может быть небезопасным? Приведите пример ситуации, в которой финализатор может не сработать.

runtime.SetFinalizer позволяет привязать функцию (финализатор) к объекту, которая будет выполнена, когда сборщик мусора сочтёт объект неиспользуемым. Финализатор запускается сборщиком мусора, но его выполнение зависит от цикла GC, поэтому точное время выполнения не гарантируется.

Использование финализаторов может быть небезопасным из-за нескольких факторов:
1. Финализаторы могут сработать не сразу после того, как объект станет неиспользуемым, а в зависимости от цикла GC.
2. Tiny objects: объекты размером менее 16 байт и без указателей (так называемые "tiny objects") могут группироваться вместе, и если хотя бы один объект в группе ещё используется, финализаторы для остальных объектов могут не сработать.
3. Ограничение на привязку к началу блока памяти: финализатор можно установить только для указателя, указывающего на начало блока памяти объекта. Если привязать финализатор к внутреннему полю структуры, программа завершится с ошибкой.

В следующем примере FourBytes является "tiny object", и финализатор может не сработать, если другие объекты из этой же группы продолжают использоваться:

type FourBytes struct {
A byte; B byte; C byte; D byte
}

func final() {
a := &FourBytes{}
runtime.SetFinalizer(a, func(a *FourBytes) {
fmt.Println("Финализатор FourBytes вызван")
})
}

func main() {
final()
runtime.GC()
time.Sleep(time.Millisecond)
}


В этом коде финализатор может либо сработать, либо нет, в зависимости от того, как Go управляет группой маленьких объектов. Это делает использование финализаторов в Go непредсказуемым, и в большинстве случаев рекомендуется использовать явное освобождение ресурсов с методами, такими как Close или Dispose.

Библиотека Go для собеса | вопросы с собеседований

06 Nov, 20:50


💬 Как канонизировать строки для экономии памяти в Go?

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

1️⃣ Канонизация строк при их совпадении

if str1 == str2 {
str1 = str2 // освобождаем базовый блок памяти str2
}


Вот пример реализации для канонизации строк в слайсе:
func CanonicalizeStrings(ss []string) {
type S struct {
str string
index int
}
var temp = make([]S, len(ss))
for i := range temp {
temp[i] = S {
str: ss[i],
index: i,
}
}

for i := 0; i < len(temp); {
var k = i+1
for j := k; j < len(temp); j++ {
if temp[j].str == temp[i].str {
temp[j].str = temp[i].str
temp[k], temp[j] = temp[j], temp[k]
k++
}
}
i = k
}

for i := range temp {
ss[temp[i].index] = temp[i].str
}
}


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

2️⃣ Использование unique.Handle из Go 1.23

В Go 1.23 добавлена возможность использовать unique.Handle для удобной канонизации строк.

import "unique"

func CanonicalizeString(s string) string {
return unique.Make(s).Value()
}

func CanonicalizeStrings(ss []string) {
for i, s := range ss {
ss[i] = CanonicalizeString(s)
}
}


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

Примечание: метод unique.Make не всегда подходит для всех ситуаций. Функция unique.Make выделяет блок памяти для каждой уникальной строки. Если некоторые неравные строки, подлежащие канонизации, уже делят один и тот же блок памяти, unique.Make выделит новый блок памяти для каждой из строк, что может привести к увеличению использования памяти (вместо экономии).

Библиотека Go для собеса | вопросы с собеседований

05 Nov, 20:58


⚒️ sync.Map в Go: правильный инструмент для правильной работы

Оказывается, sync․Map под капотом поддерживает две мапы, что может быть неидеально, если вы часто добавляете или удаляете ключи.

Читайте продолжение серии статей Phuong Le про сложные аспекты Go на простых иллюстрациях👇

👉
Читать
👉
Другие статьи в серии:
• Go sync.Mutex: нормальный/starvation режим
• Go sync.WaitGroup и проблема выравнивания
• Go sync.Pool и механика, стоящая за ним
• Go sync.Cond, самый недооцененный механизм синхронизации
• Пакет singleflight

Библиотека Go для собеса | вопросы с собеседований

05 Nov, 09:01


Сможешь ли ты пройти собес? Смотри собеседование на Middle Go-разработчика в прямом эфире в этот четверг 👨‍💻

7 ноября в 19:00 (мск) Даниил Динько, TeamLead команды Go-разработчиков в Oxygen Forensics (ex-Ozon), проведет открытое собеседование на Middle-позицию:

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

Эфир будет полезен, если ты:
– Планируешь повысить свой грейд в Go, чтобы увеличить ЗП или сменить компанию.
– Хочешь сменить свой текущий стек на Go.
– Готовишься к собеседованию прямо сейчас и хочешь получить оффер.

Это бесплатно?
Бесплатно

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

Библиотека Go для собеса | вопросы с собеседований

04 Nov, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

02 Nov, 19:40


🔥 Разработка блога на Go: серия видеоуроков от Jon Calhoun, Go-разработчика и автора gophercises.com / algorithmswithgo.com

▶️ Rendering Raw Markdown
▶️ Rendering Markdown as HTML
▶️ Metadata via Frontmatter
▶️ Index Page

Библиотека Go для собеса | вопросы с собеседований

01 Nov, 20:51


💬 В Go 1.21 появились аналоги sync.Once. Какие именно и для чего они предназначены?

🔸 OnceFunc: функция, которая оборачивает другую функцию так, что та выполнится только один раз. Например, если обёртку wrapper() вызвать несколько раз, внутренняя функция запустится только при первом вызове. Удобно для случаев, когда необходимо гарантировать, что операция выполняется строго один раз, но хочется иметь удобный многократный интерфейс вызова.
🔸 OnceValue[T]: используется для функций, возвращающих одно значение. Это полезно для кеширования результата тяжёлой операции, например загрузки конфигурации, чтобы каждый вызов возвращал тот же результат, экономя ресурсы.
🔸 OnceValues[T, K]: это расширение, позволяющее возвращать несколько значений, включая ошибки, что упрощает обработку потенциальных ошибок во время первого вызова функции. Все последующие вызовы вернут закешированный результат (вместе с ошибкой, если она была).

Библиотека Go для собеса | вопросы с собеседований

30 Oct, 20:12


💬 В Go есть несколько способов чтения файла построчно. Чем отличается использование bufio.Scanner от bufio.Reader для построчного чтения, и когда лучше использовать ioutil.ReadFile?

🔸 bufio.Scanner — простой и эффективный способ построчного чтения, который автоматически обрабатывает строки и подойдёт для большинства задач.
🔸 bufio.Reader с ReadString предоставляет больше контроля над чтением, позволяя задать разделитель, что может быть полезно для нестандартных форматов.
🔸 ioutil.ReadFile используется для чтения всего файла в память, но подходит только для небольших файлов, так как при больших объёмах данных это может перегрузить память.

⚡️ Update: функция ioutil.ReadFile устарела. Вместо нее используйте os.ReadFile.

Библиотека Go для собеса | вопросы с собеседований

29 Oct, 20:55


🔥 Phuong Le представил очередную занимательную серию статей про I/O в Go:

▪️ Go I/O Readers, Writers и Data
▪️ Go I/O Closer, Seeker, WriterTo и ReaderFrom

Библиотека Go для собеса | вопросы с собеседований

28 Oct, 13:41


🤔 Нужна ли математика на собеседованиях?

🗓 Сегодня в 20:00 встречаемся в прямом эфире, чтобы обсудим роль математики на собеседовании, а также поделимся инсайдами как успешно пройти техническое собеседование! https://proglib.io/w/a1fe2494
🌟 Спикер: Станислав Петров – Senior Data Scientist.

😮 На вебинаре вы узнаете:

😱 Ошибаться — не страшно. Как ошибки и неудачные проекты могут стать ценным опытом. Почему «проекты в стол» способствуют профессиональному росту. И как преодолеть путь от junior до senior.

🙌🏻 Собеседования: можно ли к ним не готовиться?! Поделимся эффективными стратегиями подготовки и расскажем, на что работодатели обращают внимание в первую очередь.

✍️ Разберем реальные тестовые задачи, которые дают на собеседованиях на позицию Data Scientist.

🎁 Бонус: расскажем как проводить эффективное тестирование в маркетинге и их масштабируемость.

🎯 Почему важно посетить вебинар?

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

• Расширьте свой профессиональный кругозор и подготовьтесь к новым карьерным вызовам.

👉 Присоединяйтесь к нам и узнайте, как математика может помочь в вашей карьере https://proglib.io/w/a1fe2494

Библиотека Go для собеса | вопросы с собеседований

26 Oct, 20:01


💬 Можно ли в Go преобразовывать срезы в массивы или указатели на массивы?

Такая возможность была добавлена в Go 1.20. Когда нужно преобразовать срез в массив фиксированного размера, нельзя сделать это напрямую, как показано ниже:

a := []int{0, 1, 2, 3, 4, 5}
var b[3]int = a[0:3]

// cannot use a[0:3] (value of type []int) as [3]int value in variable
// declaration compiler(IncompatibleAssign)


Чтобы преобразовать срез в массив, команда Go обновила эту функцию в Go 1.17. А с выпуском Go 1.20 процесс преобразования стал ещё проще и удобнее с помощью новых литералов:

// Go 1.20
func main() {
a := []int{0, 1, 2, 3, 4, 5}
b := [3]int(a[0:3])

fmt.Println(b) // [0 1 2]
}


// Go 1.17
func main() {
a := []int{0, 1, 2, 3, 4, 5}
b := *(*[3]int)(a[0:3])

fmt.Println(b) // [0 1 2]
}


P. S.: можно использовать a[:3] вместо a[0:3].

Библиотека Go для собеса | вопросы с собеседований

26 Oct, 06:02


🧪 Чем заменить Postman: 5 отличных инструментов для разработки API

Postman долгое время был основным инструментом для разработки и тестирования API, но сейчас для большинства разработчиков его ограничения стали перевешивать преимущества. Рассмотрим альтернативные инструменты, которые могут предложить больше возможностей, чем Postman — даже в бесплатной версии.

👉Читаем здесь

Библиотека Go для собеса | вопросы с собеседований

25 Oct, 20:43


💬 Для чего предназначен интерфейс io.Seeker?

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

Для этого существует интерфейс io.Seeker. Он позволяет перемещать указатель файла на другую позицию в файле, чтобы можно было начать чтение или запись с нужного места.

Его функция принимает два аргумента: offset, который указывает, насколько нужно сместить курсор, и whence, который задаёт точку отсчёта:

os.SeekStart: перемещает курсор относительно начала файла.
os.SeekCurrent: перемещает курсор относительно его текущего положения.
os.SeekEnd: перемещает курсор относительно конца файла, чаще всего с отрицательным смещением.

Библиотека Go для собеса | вопросы с собеседований

25 Oct, 11:13


⚡️Разыгрываем флагманский смартфон

«Библиотека программиста» разыгрывает один из трех смартфонов на выбор:
🔹Samsung Galaxy S24 Ultra на 1 ТБ
🔹Xiaomi 14 Ultra на 512 ГБ
🔹iPhone 16 Pro Max на 512 ГБ

🔥 А еще 99 участников розыгрыша получат скидку 50% на наш курс Базовые модели ML и приложения!
Промокод будет действителен до 20 ноября.

Условия просты:
→ подписаться на Библиотека нейротекста
→ подписаться на Библиотека нейрозвука
→ подписаться на Библиотека нейрокартинок
→ нажать на кнопку «Участвовать» под этим постом

Итоги появятся 30 октября в 20:00 по московскому времени в нашем канале Библиотека программиста. Затем мы свяжемся с победителем, который сам выберет смартфон. Тем, кто получит промокод, мы вышлем его в течение недели после окончания розыгрыша.

⚠️ Убедитесь, что вам можно написать в личные сообщения или следите за результатами — если мы не сможем с вами связаться, то не сможем и отправить приз. Доставить мы можем только в города России и Беларуси.

Библиотека Go для собеса | вопросы с собеседований

22 Oct, 20:45


Когда в Go следует использовать псевдонимы типов?

Type aliases — полезный инструмент, но их следует использовать с осторожностью. Вот несколько распространённых сценариев, в которых они могут быть особенно полезны:

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

type JSONResponse = map[string]interface{}


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

type OrderID = string
type PaymentStatus = string

const (
Pending PaymentStatus = "pending"
Completed PaymentStatus = "completed"
Failed PaymentStatus = "failed"
)


🔸 Упрощение дженериков (Go 1.18+)
В Go 1.18 появились дженерики, которые позволяют функциям работать с любым типом данных. Псевдонимы типов могут упростить использование дженериков в сигнатурах функций.

type List[T any] = []T

func printList[T any](list List[T]) {
for _, item := range list {
fmt.Println(item)
}
}

Библиотека Go для собеса | вопросы с собеседований

21 Oct, 20:03


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

21 Oct, 19:54


💬 В Go существует возможность скрывать методы с помощью встраивания структур. Как можно сделать так, чтобы метод, реализующий интерфейс, был скрыт при приведении типа, даже если он присутствует у встраиваемой структуры?

Например, есть тип A, который имеет метод Hello(). Когда мы передаём экземпляр A в функцию Greet(), приведение успешно выполнится к интерфейсу Greeter, и будет вызван метод Hello().

Теперь, допустим, мы хотим использовать тип A, но не хотим, чтобы его метод Hello() был доступен. Мы можем скрыть его с помощью embedding.

Когда мы вызываем Greet(ANoHello{A: A{}}), приведение типа к интерфейсу не удаётся.

Хотя ANoHello встраивает тип A, который имеет корректный метод Hello(), приоритет получает неэкспортируемый тип noHello, который скрывает метод Hello().

Библиотека Go для собеса | вопросы с собеседований

20 Oct, 20:33


📹 Секреты внутреннего устройства аллокатора Go: видеогайд от Владимира Балуна

⏱️ Таймкоды:

00:00 Введение
01:49 Концепция аллокатора
06:09 Линейный аллокатор
11:22 Блочный аллокатор
16:21 Стековый аллокатор
20:18 Устройство malloc
25:01 Недостатки malloc
26:55 Устройство tcmalloc
28:28 Устройство аллокатора Go
32:55 Предсказуемая фрагментация памяти
40:33 Где аллоцируются объекты в Go
51:11 Почему аллокация на стеке работает быстрее, чем в куче
52:35 Расширение и уменьшение стека в Go
58:12 Зачем это все нужно знать (практические примеры)
01:03:37 Пулы объектов (sync.Pool)
01:06:57 Арены (memory arenas)
01:14:30 Аллокатор ОС

▶️ YouTube | Rutube | VK

Библиотека Go для собеса | вопросы с собеседований

17 Oct, 20:54


💬 Для чего предназначен пакет flag в Go?

Пакет flag предоставляет возможность считывать аргументы командной строки (или флаги). Он поддерживает считывание различных типов данных, включая строки, целые числа и логические значения, что делает его универсальным для различных видов приложений.

Простой пример:

package main

import (
"flag"
"fmt"
)

func main() {
name := flag.String("name", "Worl "a name to say hello to")
flag.Parse()
fmt.Printf("Hello, %s!\n", *name)
}

go run main.go -name=Gopher


Hello, Gopher!


👉 Подробнее

Библиотека Go для собеса | вопросы с собеседований

16 Oct, 09:01


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

Курс Практикума подойдёт тем, кто уже знаком с Go и хочет упорядочить свои знания, а также тем, кто хочет перейти на Go с другого языка программирования.

◾️Вы сделаете 3 проекта с нуля и добавите их в портфолио
◾️Научитесь писать сложные приложения на Go
◾️Освоите архитектурные паттерны

Начните курс бесплатно, а если понравится, платите как удобно: в рассрочку или целиком.

Начать курс бесплатно

Библиотека Go для собеса | вопросы с собеседований

15 Oct, 20:56


💬 Для чего предназначена директория internal в проекте на Go?

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

Преимущества:

▪️Инкапсуляция: мы сигнализируем, что код внутри internal является «частным» и не предназначен для использования другими модулями.
▪️Безопасность: Go автоматически запрещает импортировать код из директории internal, даже если кто-то захочет это сделать.
▪️Гибкость в рефакторинге: мы можем свободно изменять код и API внутри internal, не беспокоясь о том, что сломаем зависимости внешних пользователей.

Недостатки (особенности):

▪️Мы не можем импортировать код из internal, даже если позже это потребуется. Это может вызвать путаницу для новичков, которые не знают этой особенности.

👉 Подробнее

Библиотека Go для собеса | вопросы с собеседований

15 Oct, 06:03


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

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ

Библиотека Go для собеса | вопросы с собеседований

13 Oct, 16:30


💬 Объясните назначение основных методов sync.Map в Go.

sync.Map
в Go предоставляет набор атомарных методов для работы с мапой, поддерживающих конкурентный доступ:

Load, Store, Delete, Clear — это базовые операции, работающие так же, как методы обычной мапы в Go.
Swap заменяет старое значение новым и возвращает предыдущее значение. Этот метод также используется внутри Store().
LoadOrStore проверяет наличие ключа. Если ключ существует, метод возвращает текущее значение и loaded будет равно true. Если ключа нет, он сохраняет новое значение и возвращает его, при этом loaded будет равно false.
LoadAndDelete пытается загрузить значение по ключу. Если ключ существует, он удаляет его и возвращает значение, при этом loaded будет true. Если ключ не найден, возвращается false.
CompareAndDelete и CompareAndSwap — это условные операции. Эти методы удаляют или заменяют значение, только если текущее значение ключа соответствует старому. Если сравнение прошло успешно, ключ удаляется или обновляется, и метод возвращает true, иначе — false.
Range(f) позволяет итерировать по мапе, применяя функцию f к каждой паре ключ-значение. Если функция возвращает false, итерация прекращается (аналогично break в цикле for).

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

Библиотека Go для собеса | вопросы с собеседований

12 Oct, 19:00


🎭 Двойная игра в Power BI: как совмещать роли разработчика и администратора

Когда твой руководитель говорит: «А теперь ты еще и администратор сервера Power BI». Гид по выживанию для разработчика, внезапно ставшего многостаночником.

Читать статью

Библиотека Go для собеса | вопросы с собеседований

12 Oct, 06:23


🤔 Основы математики в Machine Learning / Deep Learning

🗓 16 октября мы разберем ряд Тейлора, собственные векторы и другие ключевые понятия в ML – https://proglib.io/w/71ad9706

Спикер: Иван Потапов – Staff Machine Learning Engineer at ShareChat. Руководит командой, отвечающей за качество рекомендаций, и имеет 8-летний опыт в сфере машинного обучения.

😮 Что будем обсуждать:

– Теорию вероятностей: случайные величины, математическое ожидание и дисперсию.

Линейную алгебру: векторы, матрицы, собственные векторы и собственные значения.

Математический анализ: производные и разложение функций в ряд Тейлора.

👨‍💻 А еще после каждого блока вас ждет практика в применении полученных знаний.

🎯 Почему это важно?
Понимание математических основ помогает глубже разобраться в работающих под капотом алгоритмах ML/DL и эффективно применять их на практике.

Присоединяйтесь к нам и совершенствуйте свои навыки в машинном обучении!

📌 Регистрация по ссылке: https://proglib.io/w/71ad9706

Библиотека Go для собеса | вопросы с собеседований

10 Oct, 20:56


💬 Что такое JWT аутентификация и где она используется?

JWT (JSON Web Token) аутентификация — это способ передачи и проверки данных между сторонами в закодированном формате JSON. Токен состоит из трех частей: заголовка, claims и подписи, что делает его безопасным для передачи информации, так как данные могут быть проверены на подлинность, но не зашифрованы.

📌 Где используется:
JWT часто используется для:
1. Аутентификации — после успешного логина пользователю выдается JWT-токен, который прикрепляется к каждому последующему запросу для доступа к защищенным ресурсам.
2. Авторизации — токен может содержать информацию о правах доступа пользователя.

📌 Преимущества:
🔸 Позволяет безопасно передавать данные между клиентом и сервером.
🔸 JWT самодостаточен — не требует постоянной проверки на сервере, так как содержит всю необходимую информацию в себе.
🔸 Широко используется в REST API для аутентификации.

Библиотека Go для собеса | вопросы с собеседований

09 Oct, 20:50


Кстати, на Хабре опубликован перевод гайда про транзакции в БД на Go с использованием многослойной архитектуры 👉 https://t.me/goproglib/5276

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

Библиотека Go для собеса | вопросы с собеседований

07 Oct, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

Библиотека Go для собеса | вопросы с собеседований

06 Oct, 20:44


💬 Можно ли реализовать set на Go?

Set — это структура данных, которая хранит уникальные элементы и позволяет быстро проверять их наличие, добавлять и удалять их, без дубликатов. В Go нет встроенного типа для множеств, но мы можем использовать тип map с ключами нужного типа, а в качестве значения использовать struct{}, который не занимает память:

package main

import "fmt"

// Set — коллекция уникальных элементов
type Set struct {
elements map[string]struct{}
}

// NewSet создает новое множество
func NewSet() *Set {
return &Set{elements: make(map[string]struct{})}
}

// Add добавляет элемент
func (s *Set) Add(value string) {
s.elements[value] = struct{}{}
}

// Remove удаляет элемент
func (s *Set) Remove(value string) {
delete(s.elements, value)
}

// Contains проверяет наличие элемента
func (s *Set) Contains(value string) bool {
_, found := s.elements[value]
return found
}

// List возвращает все элементы в виде среза
func (s *Set) List() []string {
keys := make([]string, 0, len(s.elements))
for key := range s.elements {
keys = append(keys, key)
}
return keys
}

// Пример использования множества
func main() {
set := NewSet()
set.Add("apple")
set.Add("banana")
fmt.Println("Contains 'apple':", set.Contains("apple"))
fmt.Println("Set elements:", set.List())
set.Remove("banana")
fmt.Println("Set after removal:", set.List())
}


Основные операции с множествами:

- Union: создаёт множество, содержащее все элементы из двух множеств.
- Intersection: возвращает множество с элементами, общими для двух множеств.
- Difference: возвращает множество элементов, которые есть в первом множестве, но отсутствуют во втором.

Пример:
set1 := NewSet()
set1.Add("apple")
set1.Add("banana")
set2 := NewSet()
set2.Add("banana")
set2.Add("orange")
unionSet := set1.Union(set2)
fmt.Println("Union:", unionSet.List()) // ["apple", "banana", "orange"]


Производительность: все основные операции с помощью множеств (добавление, удаление, проверка) выполняются за время O(1) благодаря использованию мапы.

Библиотека Go для собеса | вопросы с собеседований

04 Oct, 20:57


📉👩‍💻 Руководство по сборщику мусора Go

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

👉 Читать

Библиотека Go для собеса | вопросы с собеседований

03 Oct, 20:58


Назовите лучшие практики работы с интерфейсами в Go.

1. Маленькие интерфейсы проще реализовывать и мокать.

type Reader interface {
Read(p []byte) (n int, err error)
}

вместо
type ReadCloser interface {
Read(p []byte) (n int, err error)
Close() error
}


2. Использование интерфейсов в параметрах функций для обеспечения гибкости в реализации.

func CopyData(r Reader, w Writer) error {
buf := make([]byte, 1024)
for {
n, err := r.Read(buf)
if err != nil {
return err
}
if n == 0 {
break
}
if _, err := w.Write(buf[:n]); err != nil {
return err
}
}
return nil
}


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

func NewBuffer() *bytes.Buffer {
return &bytes.Buffer{}
}


4. Использование композиции интерфейсов: создание сложных интерфейсов на основе более простых.

type ReadCloser interface {
Reader
Closer
}


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

Библиотека Go для собеса | вопросы с собеседований

02 Oct, 20:48


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

Go предоставляет для этого time.Timer и time.Ticker.

• Timers: срабатывают один раз по истечении заданного времени.
• Tickers: запускаются повторно с фиксированными интервалами.

Вот как можно использовать функцию time.Timer, чтобы подождать 2 секунды перед выполнением кода:

package main

import (
"fmt"
"time"
)

func main() {
timer := time.NewTimer(2 * time.Second)
<-timer.C
fmt.Println("Timer expired!")
}


а вот и ticker, который запускается каждую секунду:

package main

import (
"fmt"
"time"
)

func main() {
ticker := time.NewTicker(1 * time.Second)
for t := range ticker.C {
fmt.Println("Tick at", t)
}
}

Библиотека Go для собеса | вопросы с собеседований

01 Oct, 09:42


💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры

В условиях нехватки опытных специалистов и наплыва джунов, IT-компании вынуждены искать нестандартные подходы к найму. Рассмотрим основные тренды и стратегии адаптации рынка.

Читать статью

#почитать

Библиотека Go для собеса | вопросы с собеседований

29 Sep, 20:50


💬 Расскажите о назначении, составляющих, достоинствах и недостатках gRPC.

gRPC (Google Remote Procedure Calling) — система удаленного вызова процедур, разработанная Google. Основное назначение — реализация взаимодействия между микросервисными архитектурами при разработке приложений.

gRPC включает в себя три основных составляющих: стандарт сериализации данных Protocol Buffers (Protobuf), протокол передачи данных HTTP/2 и язык описания интерфейса IDL.

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

Библиотека Go для собеса | вопросы с собеседований

28 Sep, 19:28


💬 Что такое Bound Check Elimination (BCE)? Поддерживает ли Go-компилятор BCE?

Go — язык, защищающий память. При индексации элементов массива/среза/строки и операциях с вложенными срезами рантайм Go проверяет, находятся ли задействованные индексы вне диапазона. Если индекс находится вне диапазона, возникнет паника. Это называется проверкой границ.

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

Начиная с Go toolchain версии v1.7, стандартный компилятор Go начал поддерживать BCE. BCE позволяет избежать некоторых ненужных проверок границ, чтобы стандартный компилятор Go мог генерировать более эффективные программы.

Библиотека Go для собеса | вопросы с собеседований

26 Sep, 20:46


💬 В чем разница пустых и нулевых срезов в Go?

• Нулевой срез — это срез, который имеет значение nil, и он не указывает на какой-либо выделенный блок памяти. Его длина и ёмкость равны нулю, а сам срез nil.
• Пустой срез — это срез, который ссылается на существующий, но пустой блок памяти (например, s := make([]int, 0) или s := []int{}). Его длина и ёмкость равны нулю, но сам срез не является nil.

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

Библиотека Go для собеса | вопросы с собеседований

23 Sep, 20:02


🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.