Я люблю Python. Это был мой основной язык последние пять лет. Python очень дружелюбен и прост в изучении, но при этом остается очень эффективным.

Вы можете использовать его практически для чего угодно - от создания простого скрипта и веб-разработки до визуализации данных и машинного обучения.

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

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

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

Ключевые отличия, с которыми я столкнулся

Конечно, в качестве первого шага я просмотрел замечательный официальный Tour Of Go, который определенно дал мне сильные базовые знания о синтаксисе Go.

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

Я взял общие функции, которые раньше использовал в Python, такие как сериализация JSON или работа с HTTP-вызовами, и попытался написать их на Go.

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

Суслики, объединяйтесь! Если вы такой же гордый суслик, как мы, то знаете ... мы нанимаем. >> "Идти!" (предназначен каламбур)

Макет проекта

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

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

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

Статически и строго типизированный

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
}

Чтобы увидеть больше примеров, взгляните на Реальную реализацию Hootsuite горутин, каналов и оператора select или на это отличное объяснение от ArdanLabs.

Работа с JSON

Что ж, вам больше не нужно json.loads().
В Python десериализация объектов JSON очень проста - просто используйте json.loads, и все!
Но в Go, как статически типизированном языке, эта простая операция может быть более сложной.

В 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, вы можете взглянуть на этот пост или использовать Go By Example - самый лучший ресурс из шпаргалок, который у вас когда-либо будет.
Слишком ленив, чтобы преобразовать ваш JSON в структуру Go? Нет проблем - этот инструмент сделает это за вас.

Чистый код

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

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

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

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

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

Запросы Python = ›net/http
Встроенная функция net/http предоставляет действительно великолепные и очень простые в использовании реализации HTTP-клиента и сервера.
Flask + Jinja2 = ›Gin
Gin - это веб-фреймворк HTTP с очень простым API - параметры в пути, файлы загрузки, маршруты группировки (/api/v1, /api/v2), настраиваемые форматы журналов, обслуживание статических файлов, рендеринг HTML и действительно мощное специальное промежуточное ПО.
Взгляните на этот тест.
Создание интерфейса командной строки = ›Cobra
Cobra - это и библиотека для создания мощных приложений интерфейса командной строки. а также программу для создания приложений и командных файлов.
Многие из наиболее широко используемых проектов Go созданы с использованием Cobra, включая Kubernetes, etcd и OpenShift.

Некоторые другие библиотеки, которые я настоятельно рекомендую: Viper, Gonfig и этот замечательный список - Awsome-Go.

Другие источники

Есть несколько других ресурсов, которые существенно помогли мне на моем пути к Go -

[1] Франческ Кампой - вам определенно нужно проверить его канал YouTube и профиль GitHub.
У Франсеска также есть несколько отличных семинаров - Инструменты в действии и Мастерская веб-приложений.

[2] Видео GopherCon

[3] Примеры использования веб-сайтов

[4] Аккаунты Golang Weekly, Gopher Academy, Golang News в Твиттере.

Резюме

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

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

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

Это захватывающее время для го, и я призываю всех вас проверить это и стать сусликами!