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

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download 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
Что означает «D» в ACID

Durability (Долговечность).

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
📦 Главные проблемы распределенных систем (и способы их решения)

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

➡️ В этой статье мы рассмотрим четыре ключевых вызова в разработке таких систем и эффективные методы их преодоления.

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое коллизия хэш-функции

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

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

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

Чтобы избежать гонок при работе с слайсами, необходимо использовать механизмы синхронизации, такие как мьютексы (sync.Mutex или sync.RWMutex) или каналы для передачи копий данных между горутинами. Важно предотвратить одновременное изменение и чтение слайса, чтобы избежать неожиданных ошибок.


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Расскажите про аналоги default в select'e

Горутины и каналы с блокировкой: Использование горутин с механизмами синхронизации, такими как sync.WaitGroup, для контроля блокировки при работе с каналами.
Таймеры или каналы с ограничением времени: Применение time.After или time.Tick для установки временных ограничений на ожидание, избегая бесконечной блокировки, как в случае с default.

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

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

Принципы саги:
Компенсационные транзакции: Откат предыдущих шагов при сбое.
Гибкость и отказоустойчивость: Избежание блокировок и улучшение отказоустойчивости.
Деление на шаги: Каждый шаг — это независимая локальная транзакция.

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

Горутины (goroutines): Легковесные потоки, которые выполняют код асинхронно.
Машины (M): Абстракции операционных систем, отвечающие за выполнение горутин на физических процессорах.
Процессоры (P): Сущности, управляющие очередью готовых горутин и привязанные к ядрам процессоров.
Очередь ожидания (run queue): Очередь горутин, которые готовы к выполнению на процессоре.
Синхронизация: Взаимодействие с механизмами синхронизации (каналы, мьютексы, условные переменные) для управления выполнением горутин.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
⭐️ Что означает звёздочка у ресивера в Go

Звёздочка у ресивера в Go, как правило, означает, что мы работаем с указателем на тип, а не с самим значением этого типа. То есть, когда мы видим звёздочку перед типом, это указывает на то, что переменная является указателем.

Пример:
var ptr *int // указатель на int
Если у нас есть переменная типа *int, то её значение — это адрес в памяти, где хранится переменная типа int. Чтобы получить доступ к значению по этому адресу, нужно использовать оператор разыменования (тоже звёздочку):
var a int = 58
var ptr *int = &a // ptr теперь указывает на a
fmt.Println(*ptr) // выводит 58


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


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Знакомы ли с концепцией 12FA для проектирования SaaS приложений

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

Основные принципы включают:
1. Разделение конфигурации – конфигурация должна быть отдельной от кода (например, через переменные окружения).
2. Кодовая база – приложение должно иметь единую кодовую базу, которая управляется с помощью системы контроля версий.
3. Поддержка нескольких сред – приложение должно работать в различных средах (разработка, тестирование, продакшн) с минимальными изменениями в коде.
4. Обработка зависимостей – все зависимости должны быть явно заявлены в коде и управляться через зависимости, такие как go.mod для Go.
5. Сборка, релиз, выполнение – процесс развертывания приложения должен быть разделён на стадии сборки, релиза и выполнения.
6. Отслеживание состояния – приложение должно минимизировать зависимость от состояния, хранимого на сервере, и использовать внешние системы хранения состояния.


Продолжение следует...

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Знакомы ли с концепцией 12FA для проектирования SaaS приложений (часть 2)

7. Порты и связи – приложение должно быть независимым от порта, на котором оно работает, и должно использовать обмен сообщениями через порты.
8. Конкурентность – приложение должно быть масштабируемым и поддерживать параллельное выполнение с использованием процессов.
9. Обработка ошибок – ошибки должны быть обрабатываться через логи, а не через сложные механизмы восстановления состояния.
10. Репликация процессов – приложение должно поддерживать репликацию процессов, чтобы обеспечивать отказоустойчивость.
11. Документация – необходимо поддерживать документацию для быстрого развертывания приложения.
12. Тестирование и производство – код должен быть готов к тестированию и запуску на производстве с минимальными усилиями.


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

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

При склеивании строк в Go с помощью оператора «+» создается новая строка, так как строки неизменяемы. Это может быть неэффективно, так как каждый раз происходит выделение памяти для новой строки.
Для улучшения производительности в случае частых склеиваний рекомендуется использовать strings.Builder, который оптимизирует процесс и минимизирует лишние аллокации.

Пример с strings.Builder:
var builder strings.Builder
for i := 0; i < 1000; i++ {
builder.WriteString("x")
}
result := builder.String()

Это значительно эффективнее, чем использование оператора «+» в цикле.


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

В Go для работы со строками используются следующие подходы:
1. Конкатенация: Строки можно склеивать с помощью оператора +, но это неэффективно при многократных операциях.

s := "Hello, " + "world!"

2. Пакет strings: Содержит функции для поиска, замены, разделения и преобразования строк:
import "strings"
lower := strings.ToLower("HELLO") // "hello"

3. strings.Builder: Эффективен для многократной конкатенации строк, избегает излишних аллокаций.
var builder strings.Builder
builder.WriteString("Hello")
result := builder.String() // "Hello"

4. Слайсы байт: Строки в Go — это слайсы байт, и их можно манипулировать для низкоуровневой работы.
b := []byte("Hello")
b[0] = 'h'
newStr := string(b) // "hello"


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