Please enable JavaScript.
Coggle requires JavaScript to display documents.
Подготовка к собеседованиям на PHP\Go, Go (Интерфейсы, Ссылочные типы - не…
-
Go
Интерфейсы
-
Значение с типом интерфейса можно пробовать преобразовывать в другие типы. Например:
t, ok := i.(T)
s := i.(TestStruct)
-
-
Интерфейс - это структура, которая хранит
Динамическое значение - содержит все объекты, которые были созданы с таким интерфейсом
Динамический тип - содержит все типы, которые относятся к интерфейсу
-
Ссылочные типы - не копируются при передаче или копировании в другую переменную.
Нужно инициализировать через make или new.
Слайсы
Структура под капотом, которая содержит
-
-
-
Создание
var foo []byte
s = make([]byte, 5, 5)
-
-
-
-
После append при превышении длины, но не вместимости, добавляется новое значение массива
После append при превышении вместимости, вместимость увеличивается вдвое и массив тоже (при необходимости копируется)
map (хэш таблица, хешмапы)
- По ключу вычисляется хеш через функцию hasher
- Из хеша вычисляется маска для поиска ведра через сдвиговую операцию на значение логарифма по основанию 2 -1:
hash & (1<<m.logB-1)
- По маске получаем указатель на bucket
- Смотрим на LOB найденого bucket для поиска нужного ключа из 8
- находим нужный ключ и значение по нему
(6). Если ключ не тот т это коллизия, переходим к следующему
-
-
-
-
-
-
Каналы
Закрывает канал тот, кто пишет
Если много продюсеров, то закрывает канал тот, кто создаёт продюсеров
Когда присходит запись в забитый канал, гоурутина переходит в ожидание и попадает в очередь ожидания
-
-
-
Переданные аргументы в функцию фиксируются в момент, когда вызывается defer
-
Отложенные функции могут читать и устанавливать именованные возвращаемые значения объемлющей функции:
func c() (i int) {
defer func() { i++ }()
return 1
}
runtime
-
Если сделать runtime.GOMAXPROCS(1) и бесконечный цикл в гоурутине, то scheduler будет периодически переключать поток с основной гоурутины на другую
-
-
Константы
iota - идентификатор, который позволяет создавать последовательные не типизированные целочисленные константы. Значением iota является индекс ConstSpec. Не смотря на то, что первым индексом является 0, значение первой константы можно задать отличным от 0, что в свою очередь повлияет на значения последующих констант.
ООП
В Go есть динамический полиморфизм через встраивание и динамическая диспетчеризация
Контексты
Виды
-
-
-
-
TODO - заглушка, но с напоминанием о её будущей замене
Библиотеки
Mutex
RWMutex
используйте RWMutex, когда вы абсолютно уверены, что код в вашей критической секции не изменяет охраняемые данные.
-
-
Чтение из stdin - fmt.Fscan(os.Stdin, &totalCount)
-
-
Принципы
-
-
SOLID
Принцип подстановки Барбары Лисков - нужно, чтобы подклассы могли служить заменой для их родителей
Interface segregation principle - принцип разделения интерфейса. Нельзя заставлять клиента реализовать интерфейс, которым он не пользуется.
Dependency inversion principle - принцип инверсии зависимостей. Объектом зависимости должна быть абстракция, а не конкретная реализация
-
-
-
-
-
Шаблоны проектирования "банды четырёх (GoF)"
PHP
Версии
8.0
Jit
Чтобы включить нужно добавить в ini:
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=128M
-
-
-
-
-
8.3
-
-
-
Отрицательные индексы в массивах:
a[-5] = 1
a[] = 2
[-5 => 1, -4 => 2]
8.2
Новые типы null, false, true
-
-
-
Трейты
методы из текущего класса переопределяют методы трейта, которые в свою очередь переопределяют методы из базового класса
Если трейты имеют один метод, то воникает фатальная ошибка. Это можно решить через as
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
-
Файлы
Режимы
-
w - очищает или создаёт, запись, указатель в начале
-
x - создаёт, запись, указатель в конце
-
c - создаёт или открывает, запись, указатель в начале
-
Магические методы
__callStatic()
__isset(),__unset()
__sleep(),__wakeup() - выполняются до и после сериализации
__serialize(), __unserialize()
__invoke(),
__set_state() - var_export
__debugInfo() - var_dump
Операции сравнения
null == "string", null конвертируется в ""
bool or null == anythink, правая конвертируется в bool
Генераторы предоставляют лёгкий способ реализации простых итераторов без использования дополнительных ресурсов или сложностей, связанных с реализацией класса, реализующего интерфейс Iterator. Возвращает значения из функции через yield
-
-
PostgreSQL
-
join
-
(inner) join - записи, которые есть в двух таблицах одновременно
-
Транзакции
Аномалии
-
Потерянное обновление, Аномалия сериализвции (Serialization anomaly)
возникает, когда две транзакции читают одну и ту же строку таблицы, затем одна транзакция обновляет эту строку, а после этого вторая транзакция тоже обновляет ту же строку, не учитывая изменений, сделанных первой транзакцией
-
-
Фантомное чтение
Допускается в Read Uncommitted, Read Committed и Repeatable Read
Транзакция A выполняет запрос на чтение и после его выполнения обнаруживает, что данные уже поменялись транзакцией Б
-
Окна (over)
Сумма, прогруппированная по id и month:
SELECT .., SUM(amount) OVER(partition by id, month rows between unbounded preceding and current row) as total_sum FROM (SELECT id, month, amount ...) sub
Для пагинации: SELECT ..., row_number() OVER () as row, count(1) OVER () as rows_count FROM (SELECT ...) as sub
-
-
Индексы
Типы
Btree - бинарное дерево. Хранится в виде таблицы из трёх столбцов - L, R, значение ключей и ссылка на целевую строку в таблице
-
BRIN - хранят обобщённые сведения о значениях, находящихся в физически последовательно расположенных блоках таблицы
GiST - позволяет искать с помощью особых операторов
могут оптимизировать поиск «ближайшего соседа»:
location <-> point '(101,456)'
SP-GiST - позволяет организовывать на диске самые разные несбалансированные структуры данных, такие как деревья квадрантов, k-мерные и префиксные деревья
GIN-индексы представляют собой «инвертированные индексы», в которых могут содержаться значения с несколькими ключами, например массивы. Можно использовать под полнотекстовый поиск
-
Алгоритмы
Базовые структуры данных
-
-
Хэш-отображение (HashMap, хэшмэп).
-
Стек - нужно написать структуру с pop, push и peak
Очередь - структура с методами enqueue, dequeue, peek, count
-
-
-
-
-
-
Поиск по деревьям
-
-
-
Продвинутые алгоритмы
Quickselect [прим. перев. — алгоритм нахождения k наименьших элементов в неотсортированном массиве].
-
-
-
-
Если два входных параметра, то O(N+K)
Нужно откидывать константы. Нужно закладывать только то, что влияет на скорость в зависимости от N
-
-
NUTS
Работа в Go
Чтение:
nc, err := nats.Connect("natsURI", nats.Name("natReaderConnectName"))
natsChan := make(chan *nats.Msg, bufferSize)
sub, err := nc.ChanSubscribe("natsReaderSubject", natsChan)
for msg := range natsChan {
Запись:
nc, err := nats.Connect("natsURI", nats.Name("NatsConnectName"))
var someMsg struct{...}
b, err := json.Marshal(someMsg)
err = nc.Publish(subject, b)
-
Термины
Subject (топики)
просто строка, которую используют и тот, кто пишет сообщения с одной стороны, и тот, кто читает сообщения с другой стороны
иерархическую структуру, которая разделяется символом “.”. Читатели при этом могут читать из многих сабжектов, используя символы “” или “>”.
-
-
БД
-
Шардинг — это процесс разделения одного большого, структурированного, непрерывного набора некоторых объектов (я не называю их строками, поскольку мы можем шардировать любой набор данных, вне зависимости от метода их хранения) на более мелкие части с одинаковой структурой и размещения этих частичных наборов на разных физических серверах.
ACID - атомарность, согласованность, изолированность и долговечность (Atomicity, Consistency, Isolation, Durability)
-
-
-