
От преводача: преведено . Статията ще бъде полезна не само за начинаещите програмисти, но и за всички, които по един или друг начин се интересуват от 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
