Golang Flashcards
Расскажи что такое интерфейс в Golang
Интерфейс - контракт. Это определение, описывающее набор методов, которые должен реализовать другой тип данных. Если тип данных реализует все методы, содержащие интерфейс - он удовлетворяет интерфейсу. При использовании интерфейса в качестве параметра функции мы можем передавать любой объект, реализующий этот интерфейс.
По сути интерфейс это структура, которая содержит в себе ссылку на само значение и ссылку на структуру itab. itab предоставляет служебную информацию об интерфейсе и базовом типе.
type name interface
type Reader interface {
Read(p []byte) (n int, err error)
}
Назовите стандартные интерфейсы в Golang
error, Writer, Reader, Context
Что такое пустой интерфейс?
Интерфейс без методов внутри. Для его реализации не нужно описывать ни одного метода, т.е. любой тип будет реализовывать простой интерфейс.
Так в функцию можно передать любой параметр
func ExampleScope2(m …interface{}) {
fmt.Print(m)
}
Что такое nil-интерфейс
Интерфейс, который не содержит в себе никаких значений но при этом содержит в себе служебную информацию поля itab
Что такое строка в Golang?
Строка - неизменяемая последовательность байтов. Мы можем только прочитать её. Со строками можно производить сложение , но например сравнение будет работать не таr как обычно. Т.е. можно сделать так “test” == “test” (true), но знак > или < - даёт другой результат
Что такое Mutex?
Mutex это структура, предоставленная пакетом sync для разграничения доступа к ресурсам. Из-за того что при записи/изменении одного и того же участка памяти одновременно несколькими горутинами могут возникнуть конфликты. Мы используем Mutex.Lock(), который гарантирует что доступ к данному блоку кода одновременно может иметь только одна горутина.
Что такое замыкание?
Замыкание это функция которая ссылается к переменным вне её тела. При этом связь происходит по ссылке. Через эту функцию можно присваивать значение вложенной переменной.
Опишите что такое гонка данных
Гонка данных (data race) происходит, когда две go-процедуры (goroutines) одновременно обращаются к одной и той же переменной, и, по крайней мере, одно из обращений является записью.
Что такое структура данных?
Структура данных — это контейнер, который хранит данные в определенном макете. Этот «макет» позволяет структуре данных быть эффективной в некоторых операциях и неэффективной в других.
Конкурентность и параллелизм - разница
Конкурентность это скорее про организацию кода, когда параллелизм - способ исполнения кода. Одновременное взаимодействие со многими сущностями. При параллелизме несколько задач выполняются одновременно.
Что такое слайс в golang? Из чего он состоит?
Слайс представляет собой некую “обёртку” над массивом. Это структура, которая содержит в себе указатель на массив, его длину и вместимость. Длина слайса - текущее количество элементов в нём. Вместимость - выделенная под слайс максимальная память.
type slice struct {
array unsafe.Pointer
len int
cap int
}
Что такое протокол HTTP / HTTPS
Протокол прикладного уровня для передачи данных. В настоящий момент - основной способ получать информацию в ethernet. HTTPS протокол - расширение основного протокола HTTP. Secure - то есть трафик проходящий через этот протокол шифруется через ssl/tls.
Проверка норм ли сайт осуществляется через проверку сертификата.
Основой HTTP является технология «клиент-сервер», то есть предполагается существование клиента - инициирующей стороны и сервера - ожидающей запросы и отправляющей ответы.
Основные части HTTP запроса
- Стартовая строка : метод, путь к ресурсу, версия протокола http
Метод: указывает действие, которое клиент хочет выполнить (например, GET, POST, PUT, DELETE).
Путь к ресурсу (URI): определяет адрес ресурса на сервере.
Версия протокола HTTP: например, HTTP/1.1 или HTTP/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
Какие существуют инструменты для мониторинга и отладки микросервисов?
Сбор метрик и мониторинг
Prometheus: система мониторинга и оповещения с возможностью сбора и хранения метрик в формате временных рядов.
Grafana:
Логирование
ELK Stack: набор инструментов, включающий Elasticsearch, Logstash и Kibana, предназначенный для централизованного сбора, хранения и визуализации логов.
. Трассировка
Jaeger: система распределенной трассировки, помогающая отслеживать пути запросов через различные микросервисы, выявляя узкие места и задержки.
. Отладка и тестирование
Postman: инструмент для тестирования API, позволяющий отправлять запросы к микросервисам и анализировать ответы, что упрощает процесс отладки.
SoapUI: инструмент для функционального тестирования SOAP и REST API, предоставляющий возможности для автоматизации тестов и проверки производительности.
Контейнеризация и оркестрация
Docker: платформа для контейнеризации приложений, обеспечивающая их портативность и изоляцию.
Kubernetes: система оркестрации контейнеров, позволяющая управлять развертыванием, масштабированием и эксплуатацией контейнеризированных приложений.
Безопасность и мониторинг контейнеров
Sysdig: инструмент для мониторинга и обеспечения безопасности контейнеров и микросервисов, предоставляющий глубокий анализ производительности и активности приложений.
Что такое процесс?
Процесс - экземпляр выполняющейся программы. При запуске процесса система выделяет определённое место в памяти для хранения стека вызовов приложения. Каждый процесс изолирован от других в системе, так что если один процесс shutdown - это не повлияет на остальных.
Что такое поток?
Поток - наименьшая единица внутри системного процесса. разделяют общее адресное пространство и ресурсы, что позволяет им эффективно взаимодействовать и обмениваться данными. Каждый поток имеет собственный стек, регистры и счетчик команд, но общая память и ресурсы остаются общими для всех потоков процесса.
Конкурентность (Concurrency)
Конкурентность – это способность программы выполнять несколько задач одновременно, но не обязательно параллельно
Конкурентность не обязательно означает одновременное (параллельное) выполнение задач; скорее, это способ организации работы, при котором задачи могут приостанавливаться и возобновляться, обеспечивая эффективное использование ресурсов.
Какие знаешь примитивы синхронизации в ОС?
В операционных системах для обеспечения корректного взаимодействия между потоками и процессами используются различные примитивы синхронизации. Они предотвращают такие проблемы, как состояния гонки и взаимные блокировки. Ниже представлены основные из них:
Мьютекс (Mutex): Обеспечивает монопольный доступ к ресурсу, позволяя только одному потоку владеть мьютексом в определенный момент времени. Другие потоки, пытающиеся захватить этот мьютекс, будут заблокированы до его освобождения.
Семафор (Semaphore): Содержит счетчик, определяющий количество потоков, которым разрешено одновременное использование ресурса. Когда поток захватывает семафор, счетчик уменьшается; при освобождении — увеличивается. Если счетчик достигает нуля, последующие потоки блокируются до освобождения семафора.
Условные переменные (Condition Variables): Используются для организации ожидания определенных условий. Поток может ждать наступления события на условной переменной, а другой поток может сигнализировать об этом событии, пробуждая ожидающие потоки.
Спинлок (Spinlock): Легковесный примитив синхронизации, при котором поток активно ожидает освобождения ресурса, постоянно проверяя его состояние в цикле. Эффективен при коротких периодах ожидания и в многопроцессорных системах.
Барьеры (Barriers): Синхронизируют набор потоков, заставляя их остановиться в определенной точке выполнения до тех пор, пока все потоки не достигнут этой точки.
Фьютекс (Futex): Низкоуровневый примитив синхронизации в Linux, объединяющий быстрые проверки в пользовательском пространстве и, при необходимости, обращение к ядру для блокировки.
Что такое сисколл?
Системный вызов (англ. system call, часто сокращается как syscall) — это механизм, посредством которого прикладная программа обращается к ядру операционной системы для выполнения операций, требующих повышенных привилегий. Примеры таких операций включают управление файлами, взаимодействие с устройствами ввода-вывода, управление процессами и выделение памяти.
от chat gpt
📌 Что такое системный вызов (syscall)?
Системный вызов (syscall, system call) — это механизм, с помощью которого программа запрашивает услуги ядра операционной системы.
Он используется, когда программе нужны привилегированные операции, например:
Чтение/запись файлов (open, read, write).
Управление процессами (fork, exec).
Работа с сетью (socket, connect).
Управление памятью (mmap, brk).
Unix-подобных системах всё является файлом, включая:
Обычные файлы (/var/log/syslog).
Стандартный ввод/вывод (stdin, stdout).
Сетевые соединения (TCP-сокеты).
Каналы межпроцессного взаимодействия (pipes).
Когда программа открывает файл или создаёт соединение, ОС выдаёт ей файловый дескриптор – число, которое используется для работы с этим ресурсом.
Файловый дескриптор (FD, File Descriptor) – это уникальное число (идентификатор), которое операционная система выдаёт процессу, когда он открывает файл, сокет или другой ресурс ввода-вывода.
Каждый процесс в ОС получает таблицу дескрипторов, через которую он взаимодействует с ресурсами. Например:
FD = 0 → стандартный ввод (stdin).
FD = 1 → стандартный вывод (stdout).
FD = 2 → стандартный поток ошибок (stderr).
FD = 3, 4, 5… → дескрипторы открытых файлов, сокетов и т. д.
Что означает b := a[1:3:4]? Чему будет равна длина слайса? А вместимость?
Это - полносрезное выражение. Примерно состоит из s[low : high : max]
длина итогового слайса = high - low т.е 2, а capacity = max-low
Что такое map в golang?
Набор неупорядоченных пар ключ-значение. Записывается как 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` были максимально эффективными.