💬Один из частых вопросов на собесах: «Что такое конкурентность в Go?»
Сначала надо вспомнить о таких вещах, как асинхронность и параллельность.
📌Асинхронность говорит о порядке исполнения кода. Вычисления в системе могут идти двумя способами:
— когда код выполняется последовательно — синхронно;
— когда результат выполнения кода доступен не сразу, а через некоторое время в виде некоторого асинхронного (нарушающего обычный порядок выполнения) вызова, — асинхронно.
📌Параллельность в свою очередь говорит о том, что физически происходит несколько процессов одновременно.
При этом, с точки зрения кода программы это всё может выглядеть вполне синхронно. Например, если подряд вызываются две функции, то исполняющая среда может решить по каким-то признакам, что эти функции независимы, и выполнить их параллельно. С точки зрения программы этого заметно не будет.
На практике, конечно, эти понятия пересекаются очень часто, потому что асинхронные вызовы делаются как раз для того, чтобы исполнять функции параллельно с основным кодом. То есть, асинхронные вызовы — самый распространённый способ управления распараллеливанием на уровне кода.
📌Конкурентность обеспечивает выполнение нескольких задач посредством переключения контекста.
Конкурентные вычисления реализуются на одном ядре системы. Примитивы конкурентности в Go:
— горутины;
— каналы;
— мьютексы (объекты Mutex, RWMutex);
— оператор select … case;
— объекты waitGroup, errGroup.
Конкурентность позволяет увеличить скорость обработки данных при наличии ресурсов, если выполнять те же задачи, которые можно выполнять последовательно.
Сначала надо вспомнить о таких вещах, как асинхронность и параллельность.
📌Асинхронность говорит о порядке исполнения кода. Вычисления в системе могут идти двумя способами:
— когда код выполняется последовательно — синхронно;
— когда результат выполнения кода доступен не сразу, а через некоторое время в виде некоторого асинхронного (нарушающего обычный порядок выполнения) вызова, — асинхронно.
📌Параллельность в свою очередь говорит о том, что физически происходит несколько процессов одновременно.
При этом, с точки зрения кода программы это всё может выглядеть вполне синхронно. Например, если подряд вызываются две функции, то исполняющая среда может решить по каким-то признакам, что эти функции независимы, и выполнить их параллельно. С точки зрения программы этого заметно не будет.
На практике, конечно, эти понятия пересекаются очень часто, потому что асинхронные вызовы делаются как раз для того, чтобы исполнять функции параллельно с основным кодом. То есть, асинхронные вызовы — самый распространённый способ управления распараллеливанием на уровне кода.
📌Конкурентность обеспечивает выполнение нескольких задач посредством переключения контекста.
Конкурентные вычисления реализуются на одном ядре системы. Примитивы конкурентности в Go:
— горутины;
— каналы;
— мьютексы (объекты Mutex, RWMutex);
— оператор select … case;
— объекты waitGroup, errGroup.
Конкурентность позволяет увеличить скорость обработки данных при наличии ресурсов, если выполнять те же задачи, которые можно выполнять последовательно.
🔥7👍4⚡1❤1
💬Что такое ООП и как эта методология реализована в Go?
Это методология, при которой программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. Каждый объект является экземпляром определённого класса, а классы образуют иерархию наследования.
Основные принципы ООП:
🔸Абстракция
🔸Инкапсуляция
🔸Наследование
🔸Полиморфизм
📌Но! В Go нет классов, объектов, исключений и шаблонов. Нет иерархии типов, но есть сами типы — то есть возможность описывать свои типы/структуры. Структурные типы (с методами) служат тем же целям, что и классы в других языках.
📌В Go мы можем выражать все прямолинейно, в отличие от использования классов, то есть отдельно описывать свойства, а отдельно поведение, и использовать композицию вместо привычного наследования, которого в Go нет.
📌В Go есть интерфейсы — типы, которые объявляют наборы методов. Подобно интерфейсам в других языках, они не имеют реализации. Объекты, которые реализуют все методы интерфейса, автоматически реализуют интерфейс.
📌Инкапсуляция в Go реализована на уровне пакетов. Имена, начинающиеся со строчной буквы, видны только внутри этого пакета (не являются экспортируемыми). И наоборот — все, что начинается с заглавной буквы — доступно извне пакета.
Это методология, при которой программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. Каждый объект является экземпляром определённого класса, а классы образуют иерархию наследования.
Основные принципы ООП:
🔸Абстракция
🔸Инкапсуляция
🔸Наследование
🔸Полиморфизм
📌Но! В Go нет классов, объектов, исключений и шаблонов. Нет иерархии типов, но есть сами типы — то есть возможность описывать свои типы/структуры. Структурные типы (с методами) служат тем же целям, что и классы в других языках.
📌В Go мы можем выражать все прямолинейно, в отличие от использования классов, то есть отдельно описывать свойства, а отдельно поведение, и использовать композицию вместо привычного наследования, которого в Go нет.
📌В Go есть интерфейсы — типы, которые объявляют наборы методов. Подобно интерфейсам в других языках, они не имеют реализации. Объекты, которые реализуют все методы интерфейса, автоматически реализуют интерфейс.
📌Инкапсуляция в Go реализована на уровне пакетов. Имена, начинающиеся со строчной буквы, видны только внутри этого пакета (не являются экспортируемыми). И наоборот — все, что начинается с заглавной буквы — доступно извне пакета.
👍4🤔1