Библиотека 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
Какие стратегии можно использовать для уменьшения аллокаций памяти

• Использование пула объектов
При часто повторяющихся аллокациях можно использовать пул объектов (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
Что означает принцип идентификации ресурсов в REST

Принцип идентификации ресурсов в REST означает, что каждый ресурс должен быть доступен через уникальный идентификатор, обычно представленный в виде URI. Ресурсы в контексте REST могут быть любым объектом: документом, записью в базе данных, изображением, пользователем и т.д. Каждый из этих объектов должен быть однозначно идентифицирован.

Для работы с пользователями в REST API, ресурсы могут быть идентифицированы следующим образом:

• /users — коллекция всех пользователей.

• /users/123 — ресурс с ID 123, представляющий конкретного пользователя.

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

Isolation — изолированность.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤦‍♂️ Я забил на споры о микросервисах с архитекторами, и вот почему

С момента появления концепции микросервисов прошло уже несколько лет. За это время появилось много споров о её эффективности.

Зачем спорить о микросервисах, если можно просто посмотреть на факты? Давайте разберёмся, что действительно важно

➡️ Читать статью

💬 Как вы относитесь к микросервисам? Использовали ли вы их в своих проектах? Ждём ваши комментарии 👇

🐸Библиотека devops'a
Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдёт, если попытаться использовать context.WithCancel, но не вызвать cancel()

Контекст не будет отменён, утечёт память и/или горутина не завершится, если она ждёт завершения этого контекста. Best practice — всегда вызывать cancel().

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