Библиотека 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
Что означает принцип идентификации ресурсов в 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
Можно ли сделать int(string) и string(int) соответственно

В Go нет прямой функции, как int(string) или string(int), которые можно использовать напрямую для преобразования типов. Вместо этого используются функции из пакета strconv.

1. Преобразование строки в целое число:
Для того, чтобы преобразовать строку в целое число, используется функция strconv.Atoi или strconv.ParseInt.
import "strconv"

str := "123"
num, err := strconv.Atoi(str) // преобразует строку в int
if err != nil {
// обработка ошибки
}

2. Преобразование целого числа в строку:
Для преобразования числа в строку используется функция strconv.Itoa.
import "strconv"

num := 123
str := strconv.Itoa(num) // преобразует int в строку

Кратко:
Нельзя напрямую использовать int(string) или string(int) в Go.
Для преобразования строки в число используем strconv.Atoi или strconv.ParseInt.
Для преобразования числа в строку используем strconv.Itoa.


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

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

Основной инструмент для управления временем жизни горутины — это context.Context. Он позволяет задать дедлайн или тайм-аут и передать этот контекст внутрь горутины. Горутине нужно проверять канал <-ctx.Done() и корректно завершаться, когда этот канал закрывается. Это позволяет, например, автоматически завершать работу горутин по истечении заданного времени или по сигналу отмены извне.

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

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

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чём разница между replace, exclude и require в go.mod?

require — явно добавляет зависимость (и её версию) в проект.

replace — подменяет одну версию/путь зависимости на другую (например, локальную или форк).

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

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