Хабрахабр

Мой путь от Python к Go — делюсь советами и ресурсами

Статья будет полезна не только начинающим программистам, но и всем, кто так либо иначе интересуется Go. От переводчика: перевели для вас статью Илада Леева о переходе с Python на Go.

Этот язык был моим фаворитом последние пять лет. Мне нравится Python. Используется практически для всего: от создания простых скриптов и веб-разработки до визуализации данных и машинного обучения Он дружелюбный, эффективный, и его легко выучить.

Но этот пост не о том, что лучше — Python или Go: сравнений в сети огромное количество. Постепенное «созревание» Go, обширное комьюнити и тот факт, что все больше компаний принимают этот язык на вооружение после успешных тестов, заставили меня обратить на него внимание и углубиться в литературу. Я собираюсь рассказать о том, почему выбрал Go, дав несколько советов и ссылок на полезные ресурсы для всех интересующихся темой.
По моему мнению, все зависит от области применения.

Skillbox рекомендует: Практический курс Python-разработчик с нуля.

Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».

Наблюдения

Первое, что я сделал в начале пути, — изучил отличный официальный туториал “Tour Of Go”. Он дает понимание синтаксиса языка.

Для того чтобы улучшить знания, я прочитал еще и книгу “Go for Python Programmers”, которая позволила приступить к следующему этапу — пробам и ошибкам.

Благодаря такому наглядному сравнению мне удалось выявить ключевые отличия между языками. Я взял привычные функции, которые использовал в Python (сериализация JSON или работа с HTTP-вызовами), и попробовал написать их на Go.

Компоновка проекта

Прежде всего, Python не требует специфической иерархии каталогов, тогда как Go — да.

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

Официальный туториал “How to Write Go Code” объясняет, как организовать свою работу.

Статическая строгая типизация

Go статически типизирован, и это заставит почувствовать себя не в своей тарелке тех, кто привык к динамически типизированным языкам вроде Python и Ruby.

Пример — функция, которая вычисляет сумму двух целых чисел. Нет сомнений, что динамические языки сильнее подвержены ошибкам, со стороны разработчика требуется больше усилий при проверке входных данных. Если передать строку в функцию (что случается не так уж и редко), то это приведет к ошибке TypeError.

В Go такое произойти не может, поскольку здесь нужно объявлять тип для каждой переменной и функции и то, какой тип переменной функция вернет.

Сначала это раздражает: мне казалось, что эта особенность Go замедляет работу, — но потом пришло понимание, что на самом деле объявление всего экономит время, а вероятность ошибки снижается.

Нативный параллелизм

У Go есть нативная поддержка параллелизма с использованием подпрограмм и каналов — это удобно.

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

Вот визуализация всего сказанного от Ивана Данилюка.

package main func main() () // read from channel <-ch
}

Больше примеров здесь и здесь.

Работа с JSON

В Python все просто: используем json.loads, и нет проблем. Ну, json.loads() больше нет.

Но в Go, статически типизированном языке, эта операция становится сложнее.

Любое поле, которое не вписывается в заданную структуру, будет игнорироваться, и это хорошо. Здесь при использовании JSON все заранее определено. Данные, которые вы получили в JSON, должны быть ожидаемы, а поля и типы JSON «согласованы» обеими сторонами.
Об этом можно думать как о заранее согласованном протоколе между двумя сторонами.

{ “first”: “Elad”, “last”: “Leev”, “location”:”IL”, “id”: “93”
}

type AccountData struct { First string `json:"first"` Last string `json:"last"` Location string `json:"location"` ID string `json:"id"`
}

Конечно, вы можете десериализовать JSON без структур, но по возможности этого следует избегать и учитывать статическую природу языка.

Декодирование JSON на GO лучше всего объясняется в этом посте или здесь.

Нет проблем, этот инструмент все сделает за вас. Ленитесь конвертировать ваш JSON в Go-структуру?

Чистый код

Он считает неиспользуемые переменные ошибкой компиляции. Компилятор Go будет всегда стараться держать ваш код «в чистоте». Так, Go запустит программу gofmt при сохранении или компиляции и самостоятельно поправит форматирование. В Go используется уникальный подход, позволяющий системе решать большинство проблем форматирования.

Окей! Вам нет дела до переменных? Просто используйте _ (подчеркивание) и назначьте его пустому идентификатору.

Мастрид-туториалом для этой части работы с языком является информация из “Effective Go”.

Поиск подходящей библиотеки и фреймворков

Я использовал с Python фреймворки и библиотеки вроде Flask, Jinja2, Requests и даже Kazoo, поэтому боялся, что не найду ничего подходящего для Go.

Но комьюнити уже решило эти проблемы: у языка есть собственные уникальные библиотеки, которые позволяют полностью забыть о том, что вы использовали ранее.

Вот мои фавориты.

Python Requests => net/http

net/http предоставляет удобную и легкую в использовании реализацию HTTP-клиента и сервера.

Flask + Jinja2 => Gin

Gin — веб-фреймворк HTTP с очень простым API: параметрами в пути, загружаемыми файлами, маршрутизацией групп (/ api / v1, / api / v2), пользовательскими форматами журналов, обслуживающими статические файлы, рендерингом HTML и действительно мощным кастомным middleware.
Оцените этот бенчмарк.

CLI Creation => Cobra

Cobra — библиотека для создания мощных CLI-приложений, а также программа для генерации приложений и командных файлов.
Cobra применяется во многих крупных Go-проектах, включая Kubernetes, etcd и OpenShift.

Вот еще несколько библиотек, которые я настоятельно рекомендую: Viper, Gonfig и этот потрясающий список — Awesome-Go.

Другие полезные ресурсы

[1] Francesc Campoy  —  вам определенно нужно оценить эти YouTube-канал и GitHub-профиль.

[2] GopherCon — видео.

[3] Go Web Examples.

[4] Golang Weekly, Gopher Academy, Golang News — Twitter-аккаунты.

Подводим итоги

Будучи постоянным пользователем Python в течение пяти лет, я боялся, что переход на Go будет болезненным.

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

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

Присоединяйтесь!

Skillbox рекомендует:

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть