Go(Golang) — это что-то новое для вас. Эта статья не требует никакого предварительного опыта работы с языком.

Мы пройдемся по следующим темам:

  • GoDoc
  • Статический анализ кода
  • Встроенная среда тестирования и профилирования
  • Обнаружение состояния гонки
  • Кривая обучения
  • Отражение

GoDoc

В Go очень серьезно относятся к документации в коде. Так же и простота.

GoDoc — это инструмент для анализа статического кода, который создает красивые страницы документации прямо из вашего кода. Отличительной чертой GoDoc является то, что он не использует никаких дополнительных языков, таких как JavaDoc, PHPDoc или JSDoc, для аннотирования конструкций в вашем коде. Только английский.

Статический анализ кода

Go сильно зависит от статического анализа кода. godoc для документации, gofmt для форматирования кода, golint для линтинга в стиле кода и многие другие.

Эти инструменты обычно реализуются как автономные приложения командной строки и легко интегрируются с любой средой кодирования.

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

Встроенная среда тестирования и профилирования

Вы когда-нибудь пытались выбрать среду тестирования для проекта JavaScript, который вы начинаете с нуля? Если это так, то вы можете понять, как тяжело пройти через такой аналитический паралич. Возможно, вы также поняли, что не используете около 80% выбранного вами фреймворка.

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

Он создает готовые выходные данные, удобные для CI, и его использование обычно так же просто, как запуск go test. Конечно, он также поддерживает расширенные функции, такие как параллельный запуск тестов, пометка их как пропущенных и многое другое.

Обнаружение состояния гонки

Возможно, вы уже знаете о Go-процедурах, которые используются в Go для параллельного выполнения кода.

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

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

Тем не менее, к параллельному программированию в Go относятся очень серьезно, и, к счастью, у нас есть довольно мощный инструмент для поиска таких условий гонки. Он полностью интегрирован в цепочку инструментов Go.

Вы можете прочитать больше об этом и узнать, как его использовать здесь: Представляем Go Race Detector — The Go Blog.

Кривая обучения

Вы можете изучить ВСЕ возможности языка Go за один вечер. Я серьезно. Конечно, есть и стандартная библиотека, и лучшие практики в разных, более специфических областях. Но двух часов будет вполне достаточно, чтобы вы уверенно написали простой HTTP-сервер или приложение командной строки.

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

Go гораздо проще внедрить в вашу команду, чем Java (и семейство), JavaScript, Ruby, Python или даже PHP. Среду легко настроить, а инвестиции, которые необходимо сделать вашей команде, намного меньше, прежде чем они смогут завершить ваш первый производственный код.

Отражение

Отражение кода — это, по сути, возможность проникнуть внутрь и получить доступ к различным видам метаинформации о ваших языковых конструкциях, таких как переменные или функции.

Учитывая, что Go является статически типизированным языком, он подвергается ряду различных ограничений, когда речь идет о более слабо типизированном абстрактном программировании. Особенно по сравнению с такими языками, как Javascript или Python.

Более того, Go не реализует концепцию под названием Generics, что еще больше усложняет работу с несколькими типами абстрактным образом. Тем не менее, многие люди думают, что это на самом деле полезно для языка из-за сложности, которую привносят дженерики. И я полностью согласен.

Согласно философии Go (которая сама по себе является отдельной темой), вы должны изо всех сил стараться не переусердствовать со своими решениями. И это также относится к программированию с динамической типизацией. Придерживайтесь как можно больше статических типов и используйте интерфейсы, когда точно знаете, с какими типами имеете дело. Интерфейсы очень мощные и вездесущие в Go.

Однако все еще бывают случаи, когда вы не можете знать, с какими данными вы сталкиваетесь. Отличным примером является JSON. Вы конвертируете все виды данных туда и обратно в своих приложениях. Строки, буферы, всевозможные числа, вложенные структуры и многое другое.

Для этого вам нужен инструмент для проверки всех данных во время выполнения, который действует по-разному в зависимости от его типа и структуры. Отражение, чтобы спасти! В Go есть первоклассный пакет reflect, позволяющий вашему коду быть таким же динамичным, как на таком языке, как JavaScript.

Важное предостережение — знать, какую цену вы платите за его использование — и использовать его только тогда, когда нет более простого способа.

Подробнее об этом можно прочитать здесь: Законы отражения — The Go Blog.

Вы также можете прочитать настоящий код из исходников пакетов JSON здесь: src/encoding/json/encode.go — Исходный код.

Еще несколько тем для обсуждения. Просто следите за новостями. Спасибо.