Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка
Виммельбух, 3, перетяжка

План перехода на Go с другого языка программирования

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

70К открытий85К показов

Представляем дорожную карту по изучению языка Go, которая сделана совместно с экспертами курсов Route 256. Этот роадмап подойдёт тем разработчикам, которые уже знают какой-то язык программирования и хотят также освоить Golang:

План перехода на Go с другого языка программирования 1
  1. Основы языка Go
  2. Основные направления
  3. Базы данных
  4. Логирование
  5. Тестирование
  6. Полезные материалы для изучения языка Go
  7. Что дальше?

Основы языка Go

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

  • пакеты, переменные, функции и структуры;
  • порядок выполнения и обработка ошибок;
  • массивы, срезы и отображения;
  • указатели, методы и интерфейсы;
  • конкурентность и параллелизм;
  • среда выполнения: рефлексия, сборка мусора, планировщик задач.

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

Основные направления

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

Web-разработка

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

Для начала стоит уделить внимание пакету net/http, который входит в стандартную библиотеку и имеет функциональность для написания клиентских и серверных приложений. Большинство web-фреймворков реализуют интерфейсы данного пакета. Также в стандартной библиотеке есть html-шаблонизатор, который предоставляется в пакете html/template.

Стоит упомянуть и fasthttp — это альтернатива стандартному пакету net/http, которая считается более производительной, но несовместимой с API стандартного пакета.

Стандартной библиотеки вполне достаточно для небольших web-приложений, но для разработки производственных решений удобнее использовать сторонние библиотеки. В отличии от других языков, в Go непопулярны web-фреймворки наподобие Spring, Django, Nest.js, Laravel и т.д. Чтобы сохранить производительность и простоту, в Golang используют библиотеки, не навязывающие свою парадигму, но решающие конкретные задачи. Поэтому обычно используются микрофреймворки:

  • Gin — микрофрейм­ворк, сохраняющий баланс между простотой написания и производительностью приложений.
  • Echo — микрофрейм­ворк характеризуется быстрым HTTP-маршрутизатором и отличной документацией.
  • Fiber — микрофрейм­ворк, прототипом которого стал Node.js Express, но построенный на базе fasthttp.

Тем не менее, есть и полноценные web-фреймворки. Среди них можно отметить Beego — MVC фреймворк, вдохновленный Tornado, Sinatra и Flask.

Облачные и сетевые сервисы

Также к изучению языка Golang может подтолкнуть желание разрабатывать облачные и сетевые сервисы. Многие коммерческие сервисы изначально проектируются так, чтобы их можно было развернуть в облаке. Для них характерен ряд требований:

  • частые релизы и быстрое развертывание;
  • надежность и масштабируемость.

Go решает многие проблемы, с которыми сталкиваются разработчики облачных сервисов. Он быстро компилируется и экономно использует системные ресурсы. Встроенная поддержка параллелизма дает возможность создавать производительные программы, а простой синтаксис позволяет писать поддерживаемый и унифицированный код. Неудивительно, что многие проекты организации CNCF написаны на языке Go: Kubernetes, Prometheus, Nats, Etcd, Jaeger и другие.

В «облаках» никуда без микросервисов, поэтому здесь особенно актуальны микросервисные фреймворки. Сейчас активно развиваются:

  • GoMicro — предлагает поддержку авторизации/аутентификации и асинхронного взаимодействия между сервисами, а также включает protobuf-генератор кода для уменьшения бойлерплейта.
  • GoKit — набор инструментов, решающих большинство инфраструктурных проблем, что позволяет разработчикам сосредоточиться на разработке бизнес-логики.

Микросервисы взаимодействуют между собой через различные протоколы обмена сообщениями. Среди представителей RPC протоколов выделяется gRPC, разработанный компанией Google. В Go gRPC протокол реализуется библиотекой grpc-go.

В распределенных системах для избежания частых сетевых запросов между сервисами используют брокеры сообщений. Брокеры работают в асинхронном режиме и берут на себя ответственность за хранение и доставку сообщений. Перечислим библиотеки для некоторых брокеров сообщений:

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

Консольные приложения

Разработка консольных приложений на языке Go имеет ряд преимуществ. В отличие от интерпретируемых языков, как, например, Python и JavaScript, Go-программы компилируются в один исполняемый файл. Исполняемый файл включает все зависимости проекта, но при этом имеет небольшой размер.  Программы работают быстрее и отзывчивее, их удобно дистрибутировать до конечных пользователей. Если сравнивать Go с такими языками, как C и C++, то производительность программ на Go сопоставима с ними, но сборка проекта проходит значительно быстрее.

В небольших проектах для парсинга флагов командной строки можно использовать стандартную библиотеку flag, но для разработки серьезных CLI-приложений в Go широко распространены две библиотеки, которые отлично работают в связке:

  • Cobra — библиотека для создания современных CLI-приложений. Поддерживает автодополнение, подсказки, генерацию страницы man и алиасы для команд и флагов. Бесшовно интегрируется с библиотекой Viper.
  • Viper — комплексное решение для конфигурации приложений. Работает с форматами json, toml, yaml, hcl, а ещё с env и java-properties файлами. Также поддерживает чтение из удаленных систем конфигурации (Etcd, Consul) с возможностью отслеживания изменений.

Стоит отметить и библиотеку GoPrompt, которая позволяет создавать интерактивные CLI-приложения.

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

Базы данных

Одна из отличительных особенностей языка Go — это наличие общих интерфейсов для SQL-подобных баз данных. За это отвечает стандартный пакет database/sql. Он работает в связке с драйвером конкретной БД, что позволяет достаточно легко мигрировать на другие базы с минимальными изменениями в коде.

Во многих проектах можно увидеть использование стороннего пакета sqlx, расширяющего интерфейсы стандартного пакета.

SQL-подобных баз данных очень много, приведем примеры драйверов для некоторых из них:

Не забудем и про драйверы для популярных NoSQL баз данных:

В Golang с осторожностью относятся к использованию ORM, поскольку многие реализации используют рефлексию. Рефлексия — это механизм определения типов данных во время выполнения программы. Поэтому использование таких ORM может сказаться на производительности приложения. Но для проектов, где не требуется держать большие нагрузки, ORM могут облегчить разработку. Приведем самые известные:

  • Gorm — полноценный ORM, расширяемый плагинами.
  • Ent — entity-фреймворк, позволяющий генерировать модели и CRUD запросы на основе схемы, описанной в коде.
  • Beego ORM  — входит в состав web-фреймворка Beego.

Если в проекте нет ORM, то скорее всего он использует билдеры запросов, которые очень популярны в Go. Среди них самый известный — squirrel.

Логирование

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

Долгое время в сообществе Go был популярен логгер Logrus. Он перестал активно развиваться, поэтому при разработке новых  проектов лучше использовать другие логгеры:

  • Zap — производительный структурированный логгер от команды  Uber.
  • ZeroLog — отличается простым API и заточен для ведения логов в формате JSON.
  • Apex — структурированный логгер, вдохновленный Logrus.

Тестирование

Go выгодно выделяется встроенной поддержкой тестирования. Поэтому написание тестового кода на Go несильно отличается от написания самой программы. Каждый тестовый файл должен импортировать стандартный пакет testing, а его имя должно заканчиваться на _test.go. Запуск тестов выполняется единственной командой — go test.

Покрытие кода

В Go есть инструментарий для покрытия кода. Чтобы сгенерировать отчет о покрытии, необходимо запустить команду go test c флагом -coverprofile.

			# сгенерировать отчет о покрытии в файле coverage.out
$ go test -coverprofile coverage.out
		

Для чтения отчета используется инструмент go tool cover.

			# вывод отчета coverage.out в консоли
$ go tool cover -func coverage.out
		
			# вывод отчета coverage.out в браузере
$ go tool cover -html coverage.out
		

Профилирование

Для выявления критических частей кода часто применяется профилирование. Инструмент go test имеет встроенную поддержку нескольких видов профилей:

  • профиль процессора — определяет функции, выполнение которых требует больше всего процессорного времени.
  • профиль памяти — находит инструкции, ответственные за выделение наибольшего количества памяти.
  • профиль блокировок — выявляет операции, которые долгое время блокируют go-подпрограммы (горутины).

Запуск сбора информации для каждого профиля выполняется с указанием соответствующего флага:

			# создание журнала профиля процессора в файле cpu.log
$ go test -cpuprofile cpu.log
		
			# создание журнала профиля памяти в файле mem.log
$ go test -memprofile mem.log
		
			# создание журнала профиля блокировок в файле block.log
$ go test -blockprofile block.log
		

Собрав нужные профили, необходимо проанализировать их с помощью  инструмента go tool pprof. В основном для запуска требуется два аргумента — исполняемый файл, созданный профилем, и журнал профиля.

			# вывод профиля в консоли
$ go tool pprof -text
		
			# вывод профиля в браузере
$ go tool pprof -web
		

Фреймворки

В Go часто используют фреймворки для тестирования, которые хорошо работают в связке со стандартной библиотекой:

  • Testify — предоставляет набор удобных ассертов и имеет поддержку мокирования.
  • GoMock — заточен на создание моков. Хорошо подходит для проектов с множеством  внутренних зависимостей.
  • GoDog  — официальный Cucumber BDD фреймворк для языка Go.

Полезные материалы для изучения языка Go

Книги

Чтобы обучение Go было максимально эффективным, следует запастись полезными ресурсами.

Алан А. А. Донован, Брайан У. Керниган «Язык программирования Go»

Алан А. А. Донован, Брайан У. Керниган «Язык программирования Go»

Мэтт Батчер, Мэтт Фарина «Go на практике»

Мэтт Батчер, Мэтт Фарина «Go на практике»

Михалис Цукалос «Go для профи»

Михалис Цукалос «Go для профи»

Подкасты

Конференции и лекции

Что дальше?

Можно пройти A Tour of Go от разработчиков языка, на изучение хватит пары вечеров. После тура могут возникнуть вопросы, с ними поможет исчерпывающая документация.

Если вам больше подходит формат обучения с ментором и хочется подключиться к живому русскоязычному комьюнити, попробуйте бесплатный курс «Продвинутая разработка микросервисов на Go» от Ozon Tech.Под крылом опытных Go-разработчиков вы сделаете бота для мессенджера с gRPC, научитесь создавать распределенные приложения, поработаете с большими данными, высокими нагрузками, Machine learning и другими современными технологиями и практиками.

Ещё один способ познакомиться — подойти к изучению Go через сравнение с языком, который вы уже знаете. Например:

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

А чтобы найти подходящую библиотеку для вашей задачи, стоит заглянуть на Awesome Go — структурированный список библиотек и фреймворков, поддерживаемый сообществом Go.

Следите за новыми постами
Следите за новыми постами по любимым темам
70К открытий85К показов