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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Какую роль играет компилятор Go при проверке типов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Как под капотом работает sync.Once

Метод Do в структуре Once гарантирует, что функция, которую передали в метод, будет вызвана только один раз для каждого экземпляра Once. Если функция уже была вызвана, будущие вызовы Do не будут её повторно выполнять.

Быстрый путь:


В быстром пути (if o.done.Load() == 0) проверяет значение переменной done:

Если done равно 0 (т.е. действие ещё не выполнено), вызывается метод doSlow(f), который выполняет функцию с блокировкой.

Если done равно 1, значит действие уже выполнено, и метод просто завершает выполнение без вызова f.

Медленный путь:

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

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

После захвата мьютекса снова проверяется значение done:
Если оно всё ещё равно 0, выполняется функция.
После выполнения функции устанавливается done в 1, чтобы указать, что функция была выполнена.
Мьютекс разблокируется, и другие горутины могут продолжить выполнение.


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Зимний режим OFF. Весна начинается с апгрейда.

Если чувствуешь, что за зиму навыки подзастыли — пора их разморозить.

📦 Включили весеннюю распродажу: скидка –35% на курсы до конца марта.

Выбирай направление и выходи из спячки:

— Алгоритмы и структуры данных — чтобы собеседования в Яндекс, Ozon и другие были как уровень easy

— Математика для Data Science — для тех, кто не хочет просто «жать на кнопки», а понимать, что под капотом

— Архитектуры и шаблоны — если хочется мыслить как senior и прокачать системное мышление

— Python, Frontend, основы IT — для тех, кто стартует путь в разработке

👾 Proglib Academy — это как старая добрая 8-битная игра, но вместо врагов — практические задачи и собеседования.

Мы просто упаковали сложное обучение в пиксельную обёртку, чтобы тебе было чуть веселее прокачиваться.

🧠 Отогревай мозги, прокачивай скиллы и хватай свой power-up до конца марта.

👉 Выбрать курс
👍1🔥1
Как устроена защита от копирования в sync.once

Защита от копирования в sync.Once реализована с помощью специального поля noCopy. Это поле является пустой структурой, которое предотвращает копирование структуры sync.Once. В Go копирование структуры типа с таким полем не разрешается, и компилятор будет генерировать ошибку при попытке сделать копию этой структуры.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Реализуйте простое замыкание

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12😢4
Можно ли передать данные в body в GET запросе

Хотя HTTP позволяет добавить тело к GET-запросу, это не является стандартной практикой, и часто такие запросы могут не быть обработаны корректно на сервере или прокси. Для передачи данных в теле запроса рекомендуется использовать POST, PUT, PATCH

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Что будет при вызове runtime.Goexit в методе main

runtime.Goexit() завершает только текущую горутину, но если она вызывается в основной горутине, это приведет к deadlock.

Для завершения всей программы лучше использовать os.Exit(), чтобы избежать ошибок и корректно завершить выполнение.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Какая разница между select и обычным switch в Go?

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🥱2
Что бы сделал Go, если бы у него была возможность искать баги самостоятельно

Во-первых, он бы запускал go vet, чтобы анализировать код на наличие типичных ошибок, таких как неправильное использование переменных или несовместимость типов. Далее Go бы проверял гонки данных с помощью флага -race, чтобы находить и устранять состояния гонки в многозадачных приложениях, особенно когда несколько горутин изменяют общие данные.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔13🌚1
Как можно прервать работу с time.Sleep() в Go, если программа должна реагировать на завершение работы

В Go, использование time.Sleep() не позволяет гибко реагировать на контекст завершения (context.Done()), потому что эта функция просто «засыпает» на указанный период времени, не проверяя при этом контекст выполнения. Если программа получает сигнал о завершении работы (например, через context), и в это время выполняется time.Sleep(), программа будет продолжать «спать» до завершения времени сна, что может быть проблемой в случае необходимости немедленно завершить выполнение.

Чтобы решить эту проблему и более корректно обрабатывать паузы с учётом контекста, можно использовать несколько альтернативных подходов, которые позволяют прерывать паузы и учитывать отмену контекста. Например, можно использовать конструкцию select с каналами и функцией time.After(), а также с каналом контекста, который будет отслеживать отмену.

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

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

Как избежать false sharing:

1. Разделение данных: чтобы минимизировать false sharing, можно разместить данные, которыми часто пользуются разные горутины или потоки, в разные кэш-линии. Для этого в Go можно использовать padding (добавление пустых полей в структуру) или memory alignment (выравнивание данных по границе кэш-линии).

2. Использование более мелких блоков данных: если возможно, лучше разделить общие данные на более мелкие блоки, чтобы они не попадали в одну кэш-линию.

3. Использование атомарных операций: в некоторых случаях можно использовать атомарные операции для предотвращения пересылки данных между процессами, так как они могут помочь снизить нагрузку на кэш.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔6
Какие методы REST API идемпотентны

GET: многократные запросы на получение данных не изменяют состояние системы.

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

DELETE: повторный запрос на удаление ресурса не должен приводить к ошибке (например, если ресурс уже удален).

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔4👾1
✏️ Готовы ли вы к собеседованию

Если вы работаете с языком Go и уверены в своих знаниях — самое время это проверить.

Это мини-экзамен перед собеседованием: синтаксис, тонкости работы с горутинами, ошибки, которые делают даже опытные разработчики.

➡️ Проверить свои знания

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