Моят път от Python към Go — споделям съвети и ресурси

Моят път от Python към Go — споделям съвети и ресурси

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

Харесва ми Python. Този език беше мой любимец през последните пет години. Той е приятелски настроен, ефективен и лесен за научаване. Използва се практически за всичко: от създаване на прости скриптове и уеб разработка до визуализация на данни и машинно обучение.

Постепенното "зреене" на Go, обширната общност и фактът, че все повече компании приемат този език след успешни тестове, ме накараха да се запозная с него и да задълбоча литературата. Но този пост не е за това, кое е по-добро — Python или Go: в интернет има безброй сравнения. Според мен всичко зависи от областта на приложение. Ще разкажа защо избрах Go, давайки няколко съвета и линкове на полезни ресурси за всички, които се интересуват от тази тема.

Skillbox препоръчва: Практически курс Python разработчик от нулата.

Напомняме: за всички читатели на "Хабра" — отстъпка от 10 000 рубли при записване на всякакъв курс на Skillbox с промокод "Хабр".

Моят път от Python към Go — споделям съвети и ресурси

Наблюдения

Първото нещо, което направих в началото на пътя, беше да проуча чудесния официален туториал "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() {
    // създаване на нов канал от тип int
    ch := make(chan int)
 
    // стартиране на нов анонимен корутин
    go func() {
        // изпращане на 42 в канала
        ch <- 42
    }()
    // четене от канала
    <-ch
}

Моят път от Python към Go — споделям съвети и ресурси

Повече примери тук. и тук..

Работа с 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 Примери.

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

Обобщаваме

Като постоянен потребител на Python в продължение на пет години, се страхувах, че преходът към Go ще бъде болезнен.

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

Go бързо се развива и се надявам, че Google ще може да го направи главен език за писане на облачни приложения и инфраструктури.

Присъединявайте се!

Моят път от Python към Go — споделям съвети и ресурси

Skillbox препоръчва:

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster