Min vĂ€g frĂ„n Python till Go — jag delar med mig av tips och resurser

Min vĂ€g frĂ„n Python till Go — jag delar med mig av tips och resurser

FrÄn översÀttaren: översatte artikeln av Ilad Leev om att övergÄ frÄn Python till Go för er. Artikeln kommer att vara anvÀndbar inte bara för nybörjande programmerare, utan ocksÄ för alla som pÄ nÄgot sÀtt Àr intresserade av Go.

Jag gillar Python. Det hÀr sprÄket har varit min favorit de senaste fem Ären. Det Àr anvÀndarvÀnligt, effektivt och lÀtt att lÀra sig. Det anvÀnds praktiskt taget till allt: frÄn att skapa simpla skript och webbutveckling till datavisualisering och maskininlÀrning.

Det gradvisa "mognandet" av Go, det omfattande communityt och det faktum att allt fler företag anammar detta sprĂ„k efter framgĂ„ngsrika tester, fick mig att lĂ€gga mĂ€rke till det och dyka djupare in i litteraturen. Men det hĂ€r inlĂ€gget handlar inte om vilket som Ă€r bĂ€ttre — Python eller Go: det finns enorma mĂ€ngder jĂ€mförelser pĂ„ nĂ€tet. Enligt min Ă„sikt beror det helt pĂ„ anvĂ€ndningsomrĂ„det. Jag kommer att berĂ€tta varför jag valt Go och ge nĂ„gra rĂ„d och lĂ€nkar till anvĂ€ndbara resurser för alla som Ă€r intresserade av Ă€mnet.

Skillbox rekommenderar: Praktisk kurs Python-utvecklare frÄn grunden.

PĂ„minnelse: för alla lĂ€sare av "Habr" — 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".

Min vĂ€g frĂ„n Python till Go — jag delar med mig av tips och resurser

Observationer

Det första jag gjorde i början av min resa var att studera den utmĂ€rkta officiella guiden “Tour Of Go”. Den ger en förstĂ„else för sprĂ„kets syntax.

För att förbĂ€ttra mina kunskaper lĂ€ste jag ocksĂ„ boken “Go for Python Programmers”, som möjliggjorde att jag kunde gĂ„ vidare till nĂ€sta steg — prövningar och misstag.

Jag tog de funktioner jag var van vid i Python (JSON-serialisering eller arbete med HTTP-anrop) och försökte skriva dem i Go. Tack vare sÄdan visuell jÀmförelse lyckades jag identifiera de viktigaste skillnaderna mellan sprÄken.

Projektkomposition

Först och frÀmst krÀver inte Python en specifik kataloghierarki, medan Go gör det.

Go anvĂ€nder en "standard"-komposition som Ă€r lite mer komplex och krĂ€ver mer arbete. Å andra sidan fĂ„r vi en vĂ€lstrukturerad kodbas dĂ€r modulĂ€r struktur anvĂ€nds, och nĂ€r projektet vĂ€xer förblir koden strikt organiserad.

Den officiella guiden “How to Write Go Code” förklarar hur man organiserar sitt arbete.

Statisk strikt typisering

Go Àr statiskt typat, och detta kommer att fÄ dem som Àr vana vid dynamiskt typade sprÄk som Python och Ruby att kÀnna sig obekvÀma.

Det rÄder ingen tvekan om att dynamiska sprÄk Àr mer benÀgna att ha fel, och det krÀvs mer anstrÀngning frÄn utvecklarens sida för att kontrollera indata. Ett exempel Àr en funktion som berÀknar summan av tvÄ heltal. Om en strÀng skickas till funktionen (vilket inte Àr sÄ ovanligt), leder det till ett TypeError.

I Go kan detta inte hÀnda, eftersom man mÄste deklarera typ för varje variabel och funktion, samt vilken typ av variabel funktionen kommer att returnera.

Först Àr det irriterande: jag kÀnde att denna funktion i Go saktade ner arbetet, men sedan kom förstÄelsen att det faktiskt sparar tid att deklarera allt, och risken för fel minskar.

Inbyggd parallellism

Go har inbyggt stöd för parallellism med hjĂ€lp av gorutiner och kanaler – det Ă€r praktiskt.

Konceptet av kanaler verkar först lite förvirrat. Men med tiden blir det tydligare och du börjar njuta av de nya möjligheterna nÀr du arbetar aktivt med dem.

HÀr Àr en visualisering av allt som sagts av Ivan Daniljuk.

package main
 
func main() {
    // skapa ny kanal av typ int
    ch := make(chan int)
 
    // starta en ny anonym gorutin
    go func() {
        // skicka 42 till kanalen
        ch <- 42
    }()
    // lÀs frÄn kanalen
    <-ch
}

Min vĂ€g frĂ„n Python till Go — jag delar med mig av tips och resurser

Fler exempel hÀr och hÀr.

Arbeta med JSON

NÄvÀl, json.loads() finns inte lÀngre. I Python Àr allt enkelt: vi anvÀnder json.loads, och inga problem.

Men i Go, ett statiskt typat sprÄk, blir denna operation mer komplicerad.

HÀr Àr allting förutbestÀmt nÀr man anvÀnder JSON. Varje fÀlt som inte passar in i den angivna strukturen kommer att ignoreras, och det Àr bra. Man kan tÀnka pÄ det som ett förhandsöverenskommet protokoll mellan tvÄ parter. De data du fÄr i JSON ska vara förvÀntade, och fÀlten och JSON-typerna Àr "överenskomna" av bÄda parter.

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

SjÀlvklart kan du deserialisera JSON utan strukturer, men det bör undvikas om möjligt med tanke pÄ sprÄkets statiska natur.

JSON-avkodning i Go förklaras bÀst i detta inlÀgg eller hÀr.

Är du lat att konvertera din JSON till Go-struktur? Inga problem, detta verktyg sköter allt Ă„t dig.

Ren kod

Go-kompilatorn kommer alltid att strÀva efter att hÄlla din kod "ren". Den betraktar oanvÀnda variabler som ett kompilationsfel. Go anvÀnder en unik metod som lÄter systemet lösa de flesta formateringsproblemen. SÄledes kommer Go att köra programmet gofmt vid sparande eller kompilering och automatiskt rÀtta till formateringen.

Bryr du dig inte om variabler? Okej! AnvÀnd bara _ ( understreck) och tilldela den till en tom identifierare.

En masterclass-tutorial för denna del av sprĂ„ket Ă€r information frĂ„n “Effective Go”.

Att hitta rÀtt bibliotek och ramverk

Jag har anvÀnt ramverk och bibliotek som Flask, Jinja2, Requests och till och med Kazoo i Python, sÄ jag var orolig för att jag inte skulle hitta nÄgot passande för Go.

Men gemenskapen har redan löst dessa problem: sprÄket har sina egna unika bibliotek som lÄter dig helt glömma vad du anvÀnde tidigare.

HÀr Àr mina favoriter.

Python Requests => net/http

net/http ger en bekvÀm och lÀttanvÀnd implementation av HTTP-klient och server.

Flask + Jinja2 => Gin

Gin Àr ett HTTP-webbramverk med ett mycket enkelt API: parametrar i vÀgen, filuppladdningar, routing för grupper (/ api / v1, / api / v2), anpassade loggformat, serva statiska filer, rendering av HTML och riktigt kraftfulla anpassade middleware.
UtvÀrdera det hÀr benchmark.

CLI-skapande => Cobra

Cobra Àr ett bibliotek för att skapa kraftfulla CLI-applikationer, samt ett program för att generera applikationer och kommandofiler.
Cobra anvÀnds i mÄnga stora Go-projekt, inklusive Kubernetes, etcd och OpenShift.

HĂ€r Ă€r nĂ„gra fler bibliotek som jag starkt rekommenderar: Viper, Gonfig och den hĂ€r fantastiska listan — Awesome-Go.

Andra anvÀndbara resurser

[1] Francesc Campoy  —  du mĂ„ste definitivt kolla in dessa YouTube-kanal och GitHub-profil.

[2] GopherCon — videor.

[3] Go Web-exempel.

[4] Golang Weekly, Gopher Academy, Golang News — Twitter-konton.

Sammanfattning

Som en lÄngvarig anvÀndare av Python i fem Är var jag rÀdd för att övergÄngen till Go skulle bli smÀrtsam.

Men nej: det finns bidrag frÄn Go-gemenskapen som utvidgar och kompletterar sprÄkets funktioner, samt olika anvÀndbara resurser som kommer att hjÀlpa dig att övergÄ.

Go utvecklas snabbt, och jag hoppas att Google kan göra det till det frÀmsta sprÄket för att skriva molnapplikationer och infrastruktur.

Följ med!

Min vĂ€g frĂ„n Python till Go — jag delar med mig av tips och resurser

Skillbox rekommenderar:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster