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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как планировщик 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
Какие стратегии можно использовать для уменьшения аллокаций памяти

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

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

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

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

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

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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как можно прервать работу с 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
Какие методы REST API идемпотентны

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

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

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

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

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

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что значит «A» из ACID

A — Atomicity (Атомарность)

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

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

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

var x int = 10 // глобальная переменная

func main() {
x := 20 // локальная переменная, затеняющая глобальную
fmt.Println(x) // Выведет 20, потому что локальная переменная затеняет глобальную
}


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что значит «C» из ACID

C — Consistency (Согласованность)

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

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

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