Calea mea de la Python la Go — împărtășesc sfaturi și resurse

Calea mea de la Python la Go — împărtășesc sfaturi și resurse

Din partea traducătorului: am tradus pentru voi un articol al lui Ilad Leev despre tranziția de la Python la Go. Articolul va fi util nu doar pentru programatorii începători, ci și pentru toți cei care sunt interesați de Go într-un fel sau altul.

Îmi place Python. Această limbaj a fost favorit pentru mine în ultimii cinci ani. Este prietenos, eficient și ușor de învățat. Este folosit practic pentru tot: de la crearea de scripturi simple și dezvoltarea web, până la vizualizarea datelor și învățarea automată.

Maturizarea treptată a Go, comunitatea extinsă și faptul că din ce în ce mai multe companii adoptă acest limbaj după teste de succes m-au determinat să-i acord atenție și să îmi aprofundez cunoștințele despre literatură. Dar această postare nu este despre care e mai bun — Python sau Go:există nenumărate comparații pe internet. În opinia mea, totul depinde de domeniul de aplicare. Am de gând să povestesc despre motivul pentru care am ales Go, oferind câteva sfaturi și linkuri către resurse utile pentru toți cei interesați de acest subiect.

Skillbox recomandă: Curs practic Dezvoltator Python de la zero.

Vă reamintim: pentru toți cititorii „Habr” — reducere de 10.000 de ruble la înscrierea la orice curs Skillbox cu codul de promovare „Habr”.

Calea mea de la Python la Go — împărtășesc sfaturi și resurse

Observații

Primul lucru pe care l-am făcut la începutul călătoriei a fost să studiez un tutorial excelent oficial “Tour Of Go”. Oferă o înțelegere a sintaxei limbajului.

Pentru a-mi îmbunătăți cunoștințele, am citit și cartea “Go for Python Programmers”, care m-a ajutat să trec la etapa următoare — încercări și greșeli.

Am luat funcțiile familiare folosite în Python (serializarea JSON sau lucrul cu apelurile HTTP) și am încercat să le scriu în Go. Datorită acestei comparații vizuale, am reușit să identific diferențele cheie dintre cele două limbaje.

Structurarea proiectului

În primul rând, Python nu necesită o ierarhie specifică a directoarelor, în timp ce Go da.

Go folosește o structură „standard” de organizare, care este puțin mai complexă și necesită mai multă muncă. Pe de altă parte, obținem o bază de cod bine structurată, unde se folosește o structură modulară, iar la extinderea proiectului, codul rămâne strict ordonat.

Tutorialul oficial “How to Write Go Code” explică cum să îți organizezi munca.

Tipizare statică strictă

Go este tipizat static, iar acest lucru îi va face să se simtă incomod pe cei obișnuiți cu limbaje tipizate dinamic, cum ar fi Python și Ruby.

Nu există nicio îndoială că limbajele dinamice sunt mai predispunse la erori, necesitând mai mult efort din partea dezvoltatorului pentru a verifica datele de intrare. De exemplu, o funcție care calculează suma a două numere întregi. Dacă se trimite un șir la funcție (ceea ce se întâmplă destul de des), va provoca o eroare de tip TypeError.

În Go, acest lucru nu se poate întâmpla, deoarece aici trebuie să declarați tipul pentru fiecare variabilă și funcție, precum și tipul pe care îl va returna funcția.

La început, acest lucru este frustrant: mi s-a părut că această caracteristică a Go-ului încetinește lucrurile — dar apoi am înțeles că, de fapt, declararea tuturor economisește timp, iar probabilitatea de eroare scade.

Paralelism nativ

Go are suport nativ pentru paralelism folosind goroutines și canale — ceea ce este foarte convenabil.

Conceptul de canale pare inițial puțin confuz. Cu toate acestea, în timp devine mai clar, iar tu începi să te bucuri de noile posibilități, lucrând activ cu ele.

Iată o vizualizare a tot ce s-a spus de Ivan Daniliuk.

package main
 
func main() {
    // crează un nou canal de tip int
    ch := make(chan int)
 
    // începe o goroutine anonimă
    go func() {
        // trimite 42 în canal
        ch <- 42
    }()
    // citește din canal
    <-ch
}

Calea mea de la Python la Go — împărtășesc sfaturi și resurse

Mai multe exemple aici și aici.

Lucrul cu JSON

Ei bine, json.loads() nu mai există. În Python este simplu: folosim json.loads și nu sunt probleme.

Dar în Go, un limbaj statically typed, această operație devine mai complexă.

Aici, când folosiți JSON, totul este definit din timp. Orice câmp care nu se potrivește structurii date va fi ignorat, ceea ce este bine. Acest lucru poate fi văzut ca un protocol predefinit între două părți. Datele pe care le primiți în JSON ar trebui să fie așteptate, iar câmpurile și tipurile JSON sunt „agreate” de ambele părți.

{
  "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"`
}

Desigur, poți deserializa JSON fără structuri, dar ar trebui să eviți acest lucru oriunde este posibil și să ții cont de natura statică a limbajului.

Decodificarea JSON în GO este cel mai bine explicată în această postare sau aici.

Te-ai săturat să convertești JSON-ul tău în structuri Go? Nicio problemă, acest instrument va face totul pentru tine.

Cod curat

Compilerul Go va încerca întotdeauna să mențină codul tău „curat”. Consideră variabilele neutilizate o eroare de compilare. Go folosește o abordare unică, permițând sistemului să rezolve cele mai multe probleme de formatare. Astfel, Go va rula programul gofmt la salvare sau compilare și va corecta automat formatarea.

Nu îți pasă de variabile? Ok! Folosește pur și simplu _ (subliniere) și alocă-l unui identificator gol.

Un ghid util pentru această parte a lucrului cu limbajul este informația din “Effective Go”.

Căutarea unei biblioteci și a unor frameworkuri potrivite

Am folosit frameworkuri și biblioteci în Python cum ar fi Flask, Jinja2, Requests și chiar Kazoo, așa că mi-era frică că nu voi găsi nimic potrivit pentru Go.

Dar comunitatea a rezolvat deja aceste probleme: limbajul are biblioteci unice care te ajută să uiți complet de cele anterioare.

Iată favoritele mele.

Python Requests => net/http

net/http oferă o implementare convenabilă și ușor de utilizat pentru client și server HTTP.

Flask + Jinja2 => Gin

Gin — un framework web HTTP cu un API foarte simplu: parametrii în cale, fișierele încărcate, rutarea grupurilor (/api/v1, /api/v2), formate personalizate de jurnal, servirea fișierelor statice, randarea HTML și middleware-uri personalizate foarte puternice.
Evaluează aceasta benchmark.

Crearea CLI => Cobra

Cobra — o bibliotecă pentru crearea de aplicații CLI puternice și un program pentru generarea aplicațiilor și fișierelor de comandă.
Cobra este folosit în multe proiecte mari Go, inclusiv Kubernetes, etcd și OpenShift.

Iată câteva alte biblioteci pe care le recomand cu căldură: Viper, Gonfig și această listă uimitoare — Awesome-Go.

Alte resurse utile

[1] Francesc Campoy — trebuie să evaluezi cu siguranță acest YouTube și profil GitHub.

[2] GopherCon — video.

[3] Go Web Examples.

[4] Golang Weekly, Gopher Academy, Golang News — conturi de Twitter.

Încheiem

Fiind utilizator constant de Python timp de cinci ani, mă temeam că trecerea la Go va fi dureroasă.

Dar nu: există resurse din comunitatea Go care extind și completează capabilitățile limbajului, precum și diverse resurse utile care te vor ajuta în tranziție.

Go se dezvoltă rapid, iar eu sper că Google va reuși să-l facă limbajul principal pentru scrierea aplicațiilor și infrastructurii cloud.

Alătură-te!

Calea mea de la Python la Go — împărtășesc sfaturi și resurse

Skillbox recomandă:

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster