{"id":14285,"url":"\/distributions\/14285\/click?bit=1&hash=346f3dd5dee2d88930b559bfe049bf63f032c3f6597a81b363a99361cc92d37d","title":"\u0421\u0442\u0438\u043f\u0435\u043d\u0434\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f","buttonText":"","imageUuid":""}

Почему вам нравится Go?

Этот вопрос - "Почему вам нравится Go?" - мне задавали на нескольких собеседованиях. Сам по себе вопрос не сложный, но он обширный и содержит множество возможностей оступиться. В ситуации сильного давления трудно собрать все свои мысли в связный ответ.

В этой заметке я постараюсь сформулировать ответ на этот страшный вопрос.

Вопрос неоднозначный, но мне он был задан именно в такой форме. Несмотря на то, что я ежедневно пишу код на Go, я бы не сказал, что у меня есть какие-то личные чувства "симпатии" к нему.

Вопрос задан для того, чтобы завязать разговор об использовании и достоинствах Go. По моему опыту, ответ должен затрагивать широкие области, представленные ниже.

Написание и развертывание кода на языке Go

Go называют языком, который прост в использовании и развертывании. Есть несколько причин, которые должны быть в центре внимания при обсуждении этого вопроса:

- Небольшой синтаксис - Синтаксис языка Go специально сделан небольшим, чтобы его было легко освоить и начать работать. Одной из целей проекта Go было упростить процесс программирования и облегчить разработчикам написание статически типизированного кода.

- Статическая типизация - код Go сильно, статически типизирован и скомпилирован. Компилятор устраняет множество ошибок и позволяет оптимизировать производительность во время компиляции. Go имеет встроенные типы для slices & maps, которые легко использовать.

- Структуры - технически Go не является объектно-ориентированным языком, но пользовательские типы создаются с помощью ключевого слова struct. Структуры могут иметь методы, привязанные к ним так же, как и объекты. Их называют облегченными объектами, поскольку они не поддерживают наследование типов.

- Интерфейсы - Хотя Go не поддерживает иерархию типов, интерфейсные типы создают многократно используемые модели поведения универсальным и надежным способом в соответствии с принципом композиции над наследованием. Интерфейсы неявно реализуются компилятором Go в структурах. Структура может реализовывать несколько интерфейсов при условии, что она реализует все требуемые ими методы. Часто интерфейсы используются для того, чтобы обернуть код, приходящий из внешней библиотеки, в интерфейс на стороне вызывающего кода, а во внутренней кодовой базе раскрыть только подмножество внешней функциональности.interface{} известен как пустой интерфейс. Ему удовлетворяют все типы, и он используется в качестве типа параметра в коде, обрабатывающем значения неизвестного типа.

- Функции первого класса - функции Go могут присваиваться переменным, передаваться в качестве параметров другим функциям и возвращаться из других функций. Это известно как поддержка функций первого класса. Это позволяет программистам Go составлять функции более высокого порядка и закрытия, что особенно полезно при динамическом программировании

- Сборка и тестирование кода Go - Команда go предоставляет функциональность для сборки и тестирования кода Go. Она проста в использовании и поставляется с установкой Go по умолчанию. Исходный код собирается в двоичный исполняемый файл. Исполняемые файлы могут быть созданы для других целей/архитектур с помощью кросс-компиляции.

- Развертывание Go-кода - двоичный исполняемый файл исходного кода Go содержит не только код приложения, но и весь вспомогательный код, необходимый для выполнения двоичного файла. Это означает, что в отличие от других языков, исполняемый файл Go может работать на новой системе без системных зависимостей, таких как инструментарий Go. Исполняемые файлы Go могут быть развернуты напрямую.

Производительность Go

Go является быстрым и производительным языком благодаря некоторым очень важным оптимизациям:
Inlining - компилятор Go сохраняет вызовы функций, рассматривая тело функции так, как если бы оно было частью вызывающей функции. Это связано с увеличением размера двоичного файла, поэтому Go делает это только в тех случаях, когда это имеет смысл
Escape-анализ - в Go реализована эта оптимизация, которая анализирует область видимости ссылок на значение. Если ссылки не выходят за пределы области видимости, то они сохраняются в стеке, что значительно быстрее и не требует сборки мусора
Сборка мусора - предотвращает утечки памяти и имеет очень низкую латентность
Параллелизм - Goroutines мультиплексируются с небольшим числом потоков ОС. Они описываются как легковесные потоки с небольшим размером стека, которые совместно планируются и управляются средой выполнения Go. Go-рутины передают управление в естественных точках остановки, что делает их более производительными, чем потоки, управляемые ядром.

Параллелизм в Go

Одним из существенных преимуществ использования Go является более простая и интуитивно понятная модель параллелизма, которая занимает центральное место в языке:
Go-рутины - функции/методы могут выполняться параллельно с другими функциями/методами путем запуска гороутина с помощью ключевого слова go. Они позволяют нашему приложению оптимально использовать свои ресурсы и выполнять более одной работы. Вся сложная работа по управлению и планированию работы гораутинов абстрагирована от разработчика
Каналы - Гороутины обмениваются данными через каналы, которые можно представить как трубы, по которым протекают данные. Каналы позволяют избежать гонок данных, поскольку они сами поддерживают очереди горутин и данных.
Паттерны параллелизма - базовые принципы работы горутин и каналов могут быть объединены в различные базовые и расширенные паттерны параллелизма. Двумя важными паттернами параллелизма являются конвейеры и пулы работников.

Напутственные слова

Поскольку ответ на этот обширный вопрос был очень емким, я привел лишь краткие ответы по каждой теме. На собеседовании вы должны быть готовы к тому, что вас попросят более подробно остановиться на тех темах, которые представляют для вас особый интерес. Я не могу предоставить такой уровень детализации в этой заметке, но я оставил ниже несколько ссылок на дополнительную литературу, которая может оказаться полезной.
Go особенно хорошо подходит для создания высокопроизводительных, масштабируемых и производительных веб-приложений. Он завоевал большую популярность в сообществе разработчиков и был принят на вооружение такими крупными игроками, как Google, Uber и Netflix. Я надеюсь, что эта статья поможет вам ответить на вопросы о преимуществах и достоинствах Go, как на собеседовании, так и вне его.
Счастливого кодинга на Go!

0
Комментарии
-3 комментариев
Раскрывать всегда