- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

Наблюдения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
}

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

Больше примеров здесь [7] и здесь [8].

Работа с 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 лучше всего объясняется в этом посте [9] или здесь [10].

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

Чистый код

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

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

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

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

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

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

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

Python Requests => net/http

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

Flask + Jinja2 => Gin

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

CLI Creation => Cobra

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

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

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

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

[2] GopherCon — видео [23].

[3] Go Web Examples [24].

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

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

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

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

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

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

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

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

Автор: fokus-lop

Источник [31]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/312389

Ссылки в тексте:

[1] для вас статью Илада Леева о переходе с Python на Go: https://medium.com/appsflyer/my-journey-from-python-to-go-3859783c6b3c

[2] Python-разработчик с нуля: https://skillbox.ru/python/?utm_source=skillbox.media&utm_medium=habr.com&utm_campaign=PTNDEV&utm_content=articles&utm_term=frompythontogo

[3] Tour Of Go: https://tour.golang.org/welcome/

[4] Go for Python Programmers: https://golang-for-python-programmers.readthedocs.io

[5] How to Write Go Code: https://golang.org/doc/code.html

[6] Ивана Данилюка: https://divan.dev/posts/go_concurrency_visualize/

[7] здесь: http://code.hootsuite.com/golang-routines-and-channels/

[8] здесь: https://www.ardanlabs.com/blog/2017/10/the-behavior-of-channels.html

[9] объясняется в этом посте: https://eager.io/blog/go-and-json/

[10] здесь: https://gobyexample.com/json

[11] этот инструмент все сделает за вас: https://mholt.github.io/json-to-go/

[12] Effective Go: https://golang.org/doc/effective_go.html

[13] net/http: https://golang.org/pkg/net/http/

[14] Gin: https://github.com/gin-gonic/gin

[15] этот: https://github.com/gin-gonic/gin/blob/master/BENCHMARKS.md

[16] Cobra: https://github.com/spf13/cobra

[17] Viper: https://github.com/spf13/viper

[18] Gonfig: https://github.com/tkanos/gonfig

[19] Awesome-Go: https://github.com/avelino/awesome-go

[20] Francesc Campoy: https://twitter.com/francesc

[21] YouTube-канал: https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw/

[22] GitHub-профиль: https://github.com/campoy

[23] GopherCon — видео: https://www.youtube.com/channel/UCx9QVEApa5BKLw9r8cnOFEA/playlists

[24] Go Web Examples: https://gowebexamples.com/

[25] Golang Weekly: https://twitter.com/golangweekly

[26] Gopher Academy: https://twitter.com/GopherAcademy

[27] Golang News: https://twitter.com/golangnews

[28] «Я — веб-разработчик PRO»: https://iamwebdev.skillbox.ru/?utm_source=skillbox.media&utm_medium=habr.com&utm_campaign=WEBDEVPRO&utm_content=articles&utm_term=frompythontogo

[29] «Профессия Java-разработчик»: https://skillbox.ru/java/?utm_source=skillbox.media&utm_medium=habr.com&utm_campaign=JAVDEV&utm_content=articles&utm_term=frompythontogo

[30] «PHP-разработчик с 0 до PRO»: https://skillbox.ru/php/?utm_source=skillbox.media&utm_medium=habr.com&utm_campaign=PHPDEV&utm_content=articles&utm_term=frompythontogo

[31] Источник: https://habr.com/ru/post/444866/?utm_campaign=444866