Golang Flashcards

1
Q

Расскажи что такое интерфейс в Golang

A

Интерфейс - контракт. Это определение, описывающее набор методов, которые должен реализовать другой тип данных. Если тип данных реализует все методы, содержащие интерфейс - он удовлетворяет интерфейсу. При использовании интерфейса в качестве параметра функции мы можем передавать любой объект, реализующий этот интерфейс.
По сути интерфейс это структура, которая содержит в себе ссылку на само значение и ссылку на структуру itab. itab предоставляет служебную информацию об интерфейсе и базовом типе.
type name interface
type Reader interface {
Read(p []byte) (n int, err error)
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Назовите стандартные интерфейсы в Golang

A

error, Writer, Reader, Context

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое пустой интерфейс?

A

Интерфейс без методов внутри. Для его реализации не нужно описывать ни одного метода, т.е. любой тип будет реализовывать простой интерфейс.
Так в функцию можно передать любой параметр
func ExampleScope2(m …interface{}) {
fmt.Print(m)
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое nil-интерфейс

A

Интерфейс, который не содержит в себе никаких значений но при этом содержит в себе служебную информацию поля itab

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое строка в Golang?

A

Строка - неизменяемая последовательность байтов. Мы можем только прочитать её. Со строками можно производить сложение , но например сравнение будет работать не таr как обычно. Т.е. можно сделать так “test” == “test” (true), но знак > или < - даёт другой результат

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое Mutex?

A

Mutex это структура, предоставленная пакетом sync для разграничения доступа к ресурсам. Из-за того что при записи/изменении одного и того же участка памяти одновременно несколькими горутинами могут возникнуть конфликты. Мы используем Mutex.Lock(), который гарантирует что доступ к данному блоку кода одновременно может иметь только одна горутина.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое замыкание?

A

Замыкание это функция которая ссылается к переменным вне её тела. При этом связь происходит по ссылке. Через эту функцию можно присваивать значение вложенной переменной.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Опишите что такое гонка данных

A

Гонка данных (data race) происходит, когда две go-процедуры (goroutines) одновременно обращаются к одной и той же переменной, и, по крайней мере, одно из обращений является записью.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое структура данных?

A

Структура данных — это контейнер, который хранит данные в определенном макете. Этот «макет» позволяет структуре данных быть эффективной в некоторых операциях и неэффективной в других.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Конкурентность и параллелизм - разница

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое слайс в golang? Из чего он состоит?

A

Слайс представляет собой некую “обёртку” над массивом. Это структура, которая содержит в себе указатель на массив, его длину и вместимость. Длина слайса - текущее количество элементов в нём. Вместимость - выделенная под слайс максимальная память.
type slice struct {
array unsafe.Pointer
len int
cap int
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое протокол HTTP / HTTPS

A

Протокол прикладного уровня для передачи данных. В настоящий момент - основной способ получать информацию в ethernet. HTTPS протокол - расширение основного протокола HTTP. Secure - то есть трафик проходящий через этот протокол шифруется через ssl/tls.
Проверка норм ли сайт осуществляется через проверку сертификата.
Основой HTTP является технология «клиент-сервер», то есть предполагается существование клиента - инициирующей стороны и сервера - ожидающей запросы и отправляющей ответы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Основные части HTTP запроса

A
  1. Стартовая строка : метод, путь к ресурсу, версия протокола http
    Метод: указывает действие, которое клиент хочет выполнить (например, GET, POST, PUT, DELETE).
    Путь к ресурсу (URI): определяет адрес ресурса на сервере.
    Версия протокола HTTP: например, HTTP/1.1 или HTTP/2.
  2. Заголовки (обязательный - Host)
    Общие заголовки: информация о соединении, типе данных и т.д.
    Заголовки запроса: характеризуют параметры запроса или данные о клиенте.
    Заголовки сущности: описывают тело сообщения, если оно присутствует.
    Пример заголовков:

makefile
Копировать
Редактировать
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml

3.Тело (необязательно)

name=John&age=30

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какие существуют инструменты для мониторинга и отладки микросервисов?

A

Сбор метрик и мониторинг
Prometheus: система мониторинга и оповещения с возможностью сбора и хранения метрик в формате временных рядов.

Grafana:

Логирование
ELK Stack: набор инструментов, включающий Elasticsearch, Logstash и Kibana, предназначенный для централизованного сбора, хранения и визуализации логов.

. Трассировка
Jaeger: система распределенной трассировки, помогающая отслеживать пути запросов через различные микросервисы, выявляя узкие места и задержки.
. Отладка и тестирование
Postman: инструмент для тестирования API, позволяющий отправлять запросы к микросервисам и анализировать ответы, что упрощает процесс отладки.

SoapUI: инструмент для функционального тестирования SOAP и REST API, предоставляющий возможности для автоматизации тестов и проверки производительности.
Контейнеризация и оркестрация
Docker: платформа для контейнеризации приложений, обеспечивающая их портативность и изоляцию.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое процесс?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое поток?

A

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

16
Q

Конкурентность (Concurrency)

A

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

Конкурентность не обязательно означает одновременное (параллельное) выполнение задач; скорее, это способ организации работы, при котором задачи могут приостанавливаться и возобновляться, обеспечивая эффективное использование ресурсов.

17
Q

Какие знаешь примитивы синхронизации в ОС?

A

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

Мьютекс (Mutex): Обеспечивает монопольный доступ к ресурсу, позволяя только одному потоку владеть мьютексом в определенный момент времени. Другие потоки, пытающиеся захватить этот мьютекс, будут заблокированы до его освобождения.

Семафор (Semaphore): Содержит счетчик, определяющий количество потоков, которым разрешено одновременное использование ресурса. Когда поток захватывает семафор, счетчик уменьшается; при освобождении — увеличивается. Если счетчик достигает нуля, последующие потоки блокируются до освобождения семафора.

Условные переменные (Condition Variables): Используются для организации ожидания определенных условий. Поток может ждать наступления события на условной переменной, а другой поток может сигнализировать об этом событии, пробуждая ожидающие потоки.

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

Барьеры (Barriers): Синхронизируют набор потоков, заставляя их остановиться в определенной точке выполнения до тех пор, пока все потоки не достигнут этой точки.

Фьютекс (Futex): Низкоуровневый примитив синхронизации в Linux, объединяющий быстрые проверки в пользовательском пространстве и, при необходимости, обращение к ядру для блокировки.

18
Q

Что такое сисколл?

A

Системный вызов (англ. system call, часто сокращается как syscall) — это механизм, посредством которого прикладная программа обращается к ядру операционной системы для выполнения операций, требующих повышенных привилегий. Примеры таких операций включают управление файлами, взаимодействие с устройствами ввода-вывода, управление процессами и выделение памяти.
от chat gpt
📌 Что такое системный вызов (syscall)?
Системный вызов (syscall, system call) — это механизм, с помощью которого программа запрашивает услуги ядра операционной системы.
Он используется, когда программе нужны привилегированные операции, например:

Чтение/запись файлов (open, read, write).
Управление процессами (fork, exec).
Работа с сетью (socket, connect).
Управление памятью (mmap, brk).

19
Q

Unix-подобных системах всё является файлом, включая:

Обычные файлы (/var/log/syslog).
Стандартный ввод/вывод (stdin, stdout).
Сетевые соединения (TCP-сокеты).
Каналы межпроцессного взаимодействия (pipes).
Когда программа открывает файл или создаёт соединение, ОС выдаёт ей файловый дескриптор – число, которое используется для работы с этим ресурсом.

A

Файловый дескриптор (FD, File Descriptor) – это уникальное число (идентификатор), которое операционная система выдаёт процессу, когда он открывает файл, сокет или другой ресурс ввода-вывода.

Каждый процесс в ОС получает таблицу дескрипторов, через которую он взаимодействует с ресурсами. Например:

FD = 0 → стандартный ввод (stdin).
FD = 1 → стандартный вывод (stdout).
FD = 2 → стандартный поток ошибок (stderr).
FD = 3, 4, 5… → дескрипторы открытых файлов, сокетов и т. д.

20
Q

Что означает b := a[1:3:4]? Чему будет равна длина слайса? А вместимость?

A

Это - полносрезное выражение. Примерно состоит из s[low : high : max]
длина итогового слайса = high - low т.е 2, а capacity = max-low

21
Q

Что такое map в golang?

A

Набор неупорядоченных пар ключ-значение. Записывается как map[v]k, где v - тип данных ключа, k - тип данных значений. Все ключи должны быть уникальными. Тип данных ключа должен быть сравнимым.
Синтаксис m:= make(map[int]string)
Map - структура для хранения данных. Под капотом - хэш таблица с бакетами.
type hmap struct {
// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.
// Make sure this stays in sync with the compiler’s definition.
count int // # live cells == size of map. Must be first (used by len() builtin)
flags uint8
B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
hash0 uint32 // hash seed

buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)

extra *mapextra // optional fields } 2. Buckets (Корзины): Хеш-таблица разделена на несколько корзин. Каждый бакет может содержать несколько пар ключ-значение, которые имеют один и тот же или близкий хеш. Это помогает организовать данные таким образом, чтобы операции с `map` были максимально эффективными.