- PVSM.RU - https://www.pvsm.ru -
От переводчика: перевели для вас статью Илада Леева о переходе с Python на Go [1]. Статья будет полезна не только начинающим программистам, но и всем, кто так либо иначе интересуется Go.
Мне нравится Python. Этот язык был моим фаворитом последние пять лет. Он дружелюбный, эффективный, и его легко выучить. Используется практически для всего: от создания простых скриптов и веб-разработки до визуализации данных и машинного обучения
Постепенное «созревание» Go, обширное комьюнити и тот факт, что все больше компаний принимают этот язык на вооружение после успешных тестов, заставили меня обратить на него внимание и углубиться в литературу. Но этот пост не о том, что лучше — Python или Go: сравнений в сети огромное количество. По моему мнению, все зависит от области применения. Я собираюсь рассказать о том, почему выбрал Go, дав несколько советов и ссылок на полезные ресурсы для всех интересующихся темой.
Skillbox рекомендует: Практический курс Python-разработчик с нуля [2].
Напоминаем: для всех читателей «Хабра» — скидка 10 000 рублей при записи на любой курс Skillbox по промокоду «Хабр».
Первое, что я сделал в начале пути, — изучил отличный официальный туториал “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
}
Больше примеров здесь [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 сможет сделать его главным языком для написания облачных приложений и инфраструктуры.
Присоединяйтесь!
Skillbox рекомендует:
- Двухлетний практический курс «Я — веб-разработчик PRO» [28].
- Образовательный онлайн-курс «Профессия Java-разработчик» [29].
- Практический годовой курс «PHP-разработчик с 0 до PRO» [30].
Автор: 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
Нажмите здесь для печати.