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

1095b245b31f2d47c4446e4259b833ef.png

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

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

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

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

a1d1082b3bfa9a680be6249593b56883.gif

Наблюдения


Первое, что я сделал в начале пути, — изучил отличный официальный туториал «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() {
    // create new channel of type int
    ch := make(chan int)
 
// start new anonymous goroutine
    go func() {
        // send 42 to channel
        ch <- 42
    }()
    // read from channel
    <-ch
}


659495e482de3cd3ffd94b332787851f.gif

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

Работа с JSON

Ну, json.loads () больше нет. В Python все просто: используем 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 используется уникальный подход, позволяющий системе решать большинство проблем форматирования. Так, Go запустит программу gofmt при сохранении или компиляции и самостоятельно поправит форматирование.

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

Мастрид-туториалом для этой части работы с языком является информация из «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 сможет сделать его главным языком для написания облачных приложений и инфраструктуры.

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

d0f6314142519346d4db38443ae04d32.gif

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

© Habrahabr.ru