Найти тему
#24 Планировщик горутин
Чтобы понять, как работает планировщик горутин, рассмотрим наглядный пример. Есть ресторан, в котором работают повара и у них множество заказов, которые необходимо приготовить. Повара в данном случае - это логические процессоры, а заказы это горутины, которые нужно обработать. Каждый повар работает только над одним заказом за раз. Аналогично этому логический процессор выполняет одну горутину. Если заказ требует длительного ожидания (например, нужно сварить 40 хинкалей), повар может начать работать над другим заказом...
309 читали · 1 год назад
#23 TCP vs UDP. Реализация на Go
Назовите разницу между протоколами TCP и UDP Этот вопрос часто встречается на собеседованиях в секции про сети или Computer Science. Важно понимать, в каких ситуациях предпочтительнее использовать TCP (Transmission Control Protocol), а в каких — UDP (User Datagram Protocol). Выбор протокола должен основываться на требованиях к приложению, особенно в контексте скорости, надежности и последовательности передачи данных. Транспортный уровень модели OSI TCP и UDP расположены на транспортном уровне (4-м уровне) модели OSI...
504 читали · 1 год назад
#22 Когда использовать sync.Map в Go
map в Go не потокобезопасны и требуют защиты через мьютексы при конкурентном доступе. В отличие от них, sync.Map обеспечивает безопасность при конкурентном доступе без необходимости явно использовать мьютексы. Основные методы sync.Map Delete(key any): удаляет элемент по ключу; Load(key any) (value any, ok bool): извлекает значение по ключу; LoadAndDelete(key any) (value any, loaded bool): извлекает и одновременно удаляет элемент; LoadOrStore(key, value any) (actual any, loaded bool): извлекает значение...
763 читали · 1 год назад
#21 Отличие горутин от потоков
Горутина — блок кода, который работает асинхронно. Объявляется через оператор go перед функцией. Главной горутиной является вызов функции main. Если завершается выполнение этой функции, то завершается и выполнение всей программы. Размер Системный поток имеет блок памяти фиксированного размера (стек), который зависит от операционной системы. Например, для Windows размер стека обычно 1 МБ. В Linux размер стека для потоков, как правило, составляет от 2 до 10 МБ, в зависимости от дистрибутива и настроек ядра...
1113 читали · 1 год назад
#20 Как слить n каналов в один в Go
Одна из самых популярных задач на каналы. Условие Даны n каналов типа int. Нужно написать функцию, которая сольет (смержит) все данные из этих каналов в один и вернет его. Решение Напишем сигнатуру функции merge, которая принимает любое количество каналов типа int на вход и возвращает результирующий канал того же типа. resultChannel сделаем с буфером 1, не обязательно, но так мы уменьшим количество переключений между горутинами. Чтобы не забыть, сразу закроем результирующий канал в отдельной горутине...
741 читали · 1 год назад
#19 Решаем задачи на слайсы в Go
Примерно в 100% случаях на собеседованиях на Go разработчика попадаются задачи, где дан какой-то кусок кода, в котором производятся операции над слайсом. Такие задачи обычно идут в начале и их нужно решать без ошибок, так как это показывает ваше знание основ языка. Для начала немного теории. Структура слайса включает в себя: array unsafe.Pointer: указатель на массив, содержащий элементы слайса. len int: длина слайса, т.е. количество элементов в слайсе. cap int: емкость слайса, т.е. максимальное количество элементов, которое слайс может вместить без перевыделения памяти​​...
731 читали · 1 год назад
#18 Приципы SOLID в Go. Часть II
Подстановки Лисков Liskov Substitution Principle - LSP Объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. В классических ООП языках подкласс наследует функциональность родителей. В Go вместо наследования используется композиция. Структура может использовать функциональность встроенной родительской структуры, однако тип родителя или какая-либо иерархия отсутствует. То есть мы не можем просто так подставить одну структуру вместо другой...
305 читали · 1 год назад
#17 Сортировка пузырьком
Временная сложность Худший и средний случай: O(n^2), где n — количество элементов в массиве. Когда массив полностью не отсортирован; Лучший случай: O(n), когда массив уже отсортирован, и алгоритм завершает работу после первого прохода. Пространственная сложность O(1), так как сортировка пузырьком является алгоритмом сортировки на месте (in-place sorting) и не требует дополнительного хранения данных кроме исходного массива. Идея Повторно проходим по массиву, сравниваем соседние элементы и меняем их местами, если они в неправильном порядке...
158 читали · 1 год назад
#16 Приципы SOLID в Go. Часть I
Принцип единственной ответственности Single Responsibility Principle - SRP Структура (в оригинале класс) должна иметь только одну причину для изменения, другими словами, структура должна иметь только одну ответственность. Представьте, что есть устройство, которое и печатает, и сканирует документы. Если это устройство сломается, то придется заменить и печатающую, и сканирующую части, даже если сломалась только одна. Лучше иметь два отдельных устройства для каждой функции. В Go, можно использовать структуры и интерфейсы, чтобы обеспечить единственную ответственность...
414 читали · 1 год назад
#15 Приведение типов в Go
Чтобы убедиться, что значение переменной соответствует определенному типу или интерфейсу перед выполнением операций над ним, используют механизм приведения этого типа. Основное приведение типов Приведение типов выполняется с использованием оператора точки. Полностью выражение выглядит так x.(T), где x — это значение, которое нужно привести, а T — тип, к которому хотим привести. Если приведение прошло успешно, результатом будет базовое значение типа T, и паника если приведение не удалось. В примере переменная a интерфейсного типа принимает значение 10...
784 читали · 1 год назад
#14 Скользящее окно
Основная идея метода скользящего окна или sliding window заключается в поддержании диапазона или "окна" элементов, которое "скользит" по массиву или строке. Метод скользящего окна позволяет улучшить вычислительную сложность до линейной, а по памяти — до константной. Как работает Представим, что у нас есть массив и нужно найти в нем подмассив, который удовлетворяет определенным условиям. Вместо того чтобы рассматривать каждый возможный подмассив отдельно, мы создаем окно фиксированной или переменной длины, которое перемещается по массиву...
749 читали · 1 год назад
#13 Работа с указателями в Go
Для работы с указателями существует два оператора — амперсанд & и звёздочка *. Если перед именем переменной стоит амперсанд, значит мы хотим получить адрес этой переменной. Звездочка - это оператор разыменовывания. В примере указатель ptr не содержит значение переменной p типа int, а содержит только ее адрес. Адрес в памяти представляет собой шестнадцатеричное число, например, 0x1400009c018. Каждая программа при запуске создается в собственном пространстве памяти, указатель будет разным при каждом запуске, поэтому, если вы запустите код из примера, то адрес у вас будет другим...
335 читали · 1 год назад