
От преводача: преведохме . Статията ще бъде полезна не само за начинаещи програмисти, но и за всички, които по един или друг начин се интересуват от Go.
Обичам Python. Този език беше моят фаворит през последните пет години. Той е приятелски, ефективен и лесен за изучаване. Използва се практически за всичко: от създаването на прости скриптове и уеб разработки до визуализиране на данни и машинно обучение.
Постепенната "зреене" на Go, обширната общност и фактът, че все повече компании приемат този език след успешни тестове, накараха да обърна внимание и да дълбоча в литературата. Но постът не е за това кой е по-добър — Python или Go: сравненията в мрежата са огромно количество. Според мен всичко зависи от областта на приложение. Смятам да разкажа защо избрах Go, като дам няколко съвета и линкове към полезни ресурси за всички, които се интересуват от темата.
Skillbox препоръчва: Практически курс .
Напомняме: за всички читатели на «Хабра» — отстъпка от 10 000 рубли при записване на всеки курс Skillbox с промокод «Хабр».

Наблюдения
Първото, което направих в началото на пътя, е да изуча отличния официален туториал “”. Той дава разбиране за синтаксиса на езика.
За да подобря знанията си, прочетох и книгата “”, която ми позволи да премина към следващия етап — проби и грешки.
Взех обичайните функции, които използвах в Python (сериализация на JSON или работа с HTTP повиквания), и се опитах да ги напиша на Go. Благодарение на това нагледно сравнение успях да установя ключовите разлики между езиците.
Структуриране на проекта
Преди всичко, Python не изисква специфична иерархия на каталогите, докато Go — да.
Go използва "стандартно" структуриране, което е малко по-сложно и изисква повече работа. От друга страна, в резултат получаваме добре структурирана основа на кода, в която се използва модулна структура, а при разширяване на проекта кодът остава стриктно подреден.
Официалният туториал “” обяснява как да организирате работата си.
Статична строга типизация
Go е статически типизиран, и това ще накара да се чувствате не на място, ако сте свикнали с динамично типизирани езици като Python и Ruby.
Няма съмнение, че динамичните езици са по-податливи на грешки, изисква се повече усилия от разработчика при проверка на входните данни. Пример — функция, която изчислява сумата на две цели числа. Ако подадете низ на функцията (което не се случва толкова рядко), това ще доведе до грешка TypeError.
В Go не може да се случи такова нещо, тъй като тук е необходимо да се обяви тип за всяка променлива и функция, и какъв тип променлива функцията ще върне.
В началото това е дразнещо: мислех си, че тази особеност на Go забавя работата, — но след това дойде осъзнаването, че всъщност обявяването на всичко спестява време, а вероятността за грешка намалява.
Нативен паралелизъм
Go предлага нативна поддръжка на паралелизъм с помощта на подпрограми и канали — това е удобно.
Концепцията за канали първоначално изглежда малко объркваща. Въпреки това с времето става по-ясна, и вие започвате да се наслаждавате на новите възможности, работейки активно с тях.
Ето визуализация на всичко казано от .
package main
func main() {
// създаване на нов канал от тип int
ch := make(chan int)
// стартиране на нов анонимен горутина
go func() {
// изпраща 42 до канала
ch <- 42
}()
// чете от канала
<-ch
} 
Повече примери и .
Работа с 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 при запазване или компилация и самостоятелно ще поправи форматирането.
Не ви интересуват променливите? Окей! Просто използвайте _ (подчертаване) и го назначете на празен идентификатор.
Мастрид-учебник за тази част от работата с езика е информацията от “”.
Търсене на подходящи библиотеки и рамки
Аз използвах с Python рамки и библиотеки като Flask, Jinja2, Requests и дори Kazoo, затова се страхувах, че няма да намеря нищо подходящо за Go.
Но общността вече е решила тези проблеми: езикът има свои уникални библиотеки, които позволяват напълно да забравите какво сте използвали преди.
Ето моите фаворити.
Python Requests => net/http
предоставя удобна и лесна за използване реализация на HTTP клиента и сървъра.
Flask + Jinja2 => Gin
— уеб рамка HTTP с много прост API: параметри в пътя, качвани файлове, маршрутизиране на групи (/ api / v1, / api / v2), потребителски формати на журнали, обслужващи статични файлове, рендериране на HTML и наистина мощен персонализиран middleware.
Оценете бенчмарк.
CLI Creation => Cobra
— библиотека за създаване на мощни CLI приложения, а също така програма за генериране на приложения и командни файлове.
Cobra се използва в много големи Go проекти, включително Kubernetes, etcd и OpenShift.
Ето още няколко библиотеки, които настоятелно препоръчвам: , и този невероятен списък — .
Други полезни ресурси
[1] — определено трябва да оцените тези и .
[2] .
[3] .
[4] , , — Twitter акаунти.
Обобщение
Като постоянен потребител на Python през последните пет години, се страхувах, че преминаването на Go ще бъде болезнено.
Но не: има разработки на общността Go, които разширяват и допълват възможностите на езика, а също така различни полезни ресурси, които ще помогнат и на вас в прехода.
Go бързо се развива и се надявам, че Google ще може да направи езика основен за написване на облачни приложения и инфраструктура.
Присъединете се!

Skillbox препоръчва:
- Двугодишен практически курс .
- Образователен онлайн курс .
- Практически годишен курс .
Източник: habr.com
