Rruga ime nga Python te Go — ndaj kĂ«shilla dhe burime

Rruga ime nga Python te Go — ndaj kĂ«shilla dhe burime

Nga përkthyesi: përkthyer për ju artikullin e Ilad Leeve mbi kalimin nga Python në Go. Artikulli do të jetë i dobishëm jo vetëm për programuesit fillestarë, por edhe për të gjithë ata që kanë ndonjë interes për Go.

Më pëlqen Python. Ky gjuhë ka qenë preferenca ime për pesë vitet e fundit. Ai është miqësor, efektiv dhe lehtësisht mësohet. Përdoret për gati çdo gjë: nga krijimi i skripteve të thjeshta dhe zhvillimi i uebit deri te vizualizimi i të dhënave dhe mësimi i makinerive.

Rritja graduale e Go, komuniteti i gjerĂ« dhe fakti qĂ« gjithnjĂ« e mĂ« shumĂ« kompani e pranojnĂ« kĂ«tĂ« gjuhĂ« pas testeve tĂ« suksesshme, mĂ« bĂ«nĂ« tĂ« fokusohesha nĂ« tĂ« dhe tĂ« thellohem nĂ« literaturĂ«. Por ky post nuk Ă«shtĂ« pĂ«r atĂ« se cila Ă«shtĂ« mĂ« e mirĂ« — Python apo Go: ka njĂ« numĂ«r tĂ« madh krahasimesh nĂ« rrjet. Sipas mendimit tim, gjithçka varet nga fusha e ndĂ«rlikimit. UnĂ« do tĂ« flas mbi arsyet se pse zgjodha Go, duke dhĂ«nĂ« disa kĂ«shilla dhe linke pĂ«r burime tĂ« dobishme pĂ«r tĂ« gjithĂ« ata qĂ« janĂ« tĂ« interesuar nĂ« temĂ«.

Skillbox rekomandon: Kurs praktik Zhvillues Python nga e para.

KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e «Habra» — zbritje prej 10,000 rublesh pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promovues «Habr».

Rruga ime nga Python te Go — ndaj kĂ«shilla dhe burime

Vëzhgimet

GjĂ«ja e parĂ« qĂ« bĂ«ra nĂ« fillim tĂ« rrugĂ«s ishte tĂ« studjoja udhĂ«zimin e shkĂ«lqyer zyrtar “Tour Of Go”. Ai ofron njĂ« kuptim tĂ« sintaksĂ«s sĂ« gjuhĂ«s.

PĂ«r tĂ« pĂ«rmirĂ«suar njohuritĂ«, lexova gjithashtu librin “Go for Python Programmers”, qĂ« mĂ« lejon tĂ« kaloj nĂ« fazĂ«n tjetĂ«r — provat dhe gabimet.

Mora funksionet e njohura që përdorja në Python (serializimi i JSON ose punë me thirrjet HTTP) dhe provova t'i shkruaj ato në Go. Falë kësaj krahasimi vizual, arrita të identifikoj dallimet kryesore mes gjuhëve.

Organizimi i projektit

SĂ« pari, Python nuk kĂ«rkon njĂ« hierarki specifike katalogĂ«sh, ndĂ«rsa Go — po.

Go pĂ«rdor njĂ« organizim “standard”, i cili Ă«shtĂ« pak mĂ« i ndĂ«rlikuar dhe kĂ«rkon mĂ« shumĂ« punĂ«. Nga ana tjetĂ«r, si rezultat marrim njĂ« bazĂ« kodi tĂ« strukturuar mirĂ«, ku pĂ«rdoret njĂ« strukturĂ« modulare, dhe kur zgjerohet projekti, kodi mbetet strikt i organizuar.

UdhĂ«zimi zyrtar “How to Write Go Code” shpjegon si tĂ« organizoni punĂ«n tuaj.

Tipizimi strikt statik

Go është i tipizuar statikisht, dhe kjo do ta bëjë të ndihen jo në vendin e duhur ata që janë mësuar me gjuhët e tipizuar dinamik si Python dhe Ruby.

Nuk ka dyshim që gjuhët dinamike janë më të prirura për gabime, dhe kërkohet më shumë përpjekje nga ana e zhvilluesit për të verifikuar të dhënat hyrëse. Një shembull është funksioni që llogarit shumën e dy numrave të tërë. Nëse një varg i dërgohet funksionit (çka ndodh jo aq shpesh), kjo do të çojë në një gabim TypeError.

Në Go kjo nuk mund të ndodhë, sepse këtu kërkohet që të shpallej tipi për çdo variabël dhe funksion, si dhe cili tip variabeli do të kthejë funksioni.

Fillimisht, kjo Ă«shtĂ« e bezdisshme: mĂ« dukej se kjo veçori e Go e ngadalĂ«son punĂ«n — por mĂ« vonĂ« erdhi kuptimi se nĂ« tĂ« vĂ«rtetĂ« shpallja e gjithçkaje kursen kohĂ« dhe ul mundĂ«sinĂ« e gabimeve.

Paralelizmi nativ

Go ka mbĂ«shtetje nativ pĂ«r paralelizmin duke pĂ«rdorur nĂ«nprogramet dhe kanalet — kjo Ă«shtĂ« komode.

Koncepti i kanaleve fillimisht duket paksa i ngatërruar. Megjithatë, ndërsa kalon koha, ai bëhet më i qartë dhe filloni të shijoni mundësitë e reja duke punuar aktivisht me to.

Ja vizualizimi i gjithçkaje të thënë nga Ivan Danilyuk.

package main
 
func main() {
    // krijo kanal të ri të tipit int
    ch := make(chan int)
 
    // fillo nënprogramin anonim
    go func() {
        // dërgo 42 në kanal
        ch <- 42
    }()
    // lexoj nga kanali
    <-ch
}

Rruga ime nga Python te Go — ndaj kĂ«shilla dhe burime

Më shumë shembuj këtu dhe këtu.

Puna me JSON

Eh, json.loads() nuk është më. Në Python është e thjeshtë: përdorim json.loads, dhe nuk ka probleme.

Por në Go, një gjuhë e tipizuar statikisht, kjo operacion bëhet më e komplikuar.

KĂ«tu, duke pĂ«rdorur JSON gjithçka Ă«shtĂ« e pĂ«rcaktuar paraprakisht. Çdo fushe qĂ« nuk pĂ«rputhet me strukturĂ«n e caktuar do tĂ« injorohet, dhe kjo Ă«shtĂ« mirĂ«. Mund ta mendoni kĂ«tĂ« si njĂ« protokoll tĂ« miratuar paraprakisht midis dy palĂ«ve. TĂ« dhĂ«nat qĂ« merrni nĂ« JSON duhet tĂ« janĂ« tĂ« pritura, dhe fushat dhe tipet e JSON janĂ« "tĂ« miratuara" nga tĂ« dy palĂ«t.

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

Sigurisht, mund të deserializoni JSON pa struktura, por sa herë që është e mundur duhet të hiqni dorë nga kjo dhe të keni parasysh natyrën statike të gjuhës.

Dekodimi i JSON në GO është më së miri shpjegohet në këtë postim ose këtu.

A keni përrallë të konvertoni JSON tuaj në strukturë Go? Asnjë problem, ky mjet do ta bëjë gjithçka për ju.

Kodi i pastër

Kompilatori Go gjithmonë do të përpiqet të mbajë kodin tuaj «të pastër». Ai e konsideron variablat e pa përdorura si një gabim kompilimi. Go përdor një qasje unike që i lejon sistemit të zgjidhë shumicën e problemeve të formatimit. Në këtë mënyrë, Go do të ekzekutojë programin gofmt gjatë ruajtjes ose kompilimit dhe do të korrigjojë vetë formatimin.

Nuk keni rëndësi për variablat? Mirë! Thjesht përdorni _ (nënvijëzim) dhe caktoni atë një identifikuesi të zbrazët.

NjĂ« burim tĂ« shkĂ«lqyer pĂ«r kĂ«tĂ« pjesĂ« tĂ« punĂ«s me gjuhĂ«n Ă«shtĂ« informacioni nga “Effective Go”.

Gjetja e bibliotekave dhe frameworkeve të përshtatshme

Kam përdorur frameworke dhe biblioteka si Flask, Jinja2, Requests dhe madje Kazoo me Python, kështu që kisha frikë se nuk do të gjeja asgjë të përshtatshme për Go.

Por komuniteti tashmë ka zgjidhur këto probleme: gjuha ka bibliotekat e saj unike që e lejojnë plotësisht të harroni atë që keni përdorur më parë.

Ja favoritet e mia.

Python Requests => net/http

net/http ofron një implementim të lehtë dhe të përdorshëm të klientit dhe serverit HTTP.

Flask + Jinja2 => Gin

Gin — njĂ« framework HTTP me njĂ« API shumĂ« tĂ« thjeshtĂ«: parametrat nĂ« rrugĂ«, skedarĂ« tĂ« ngarkuar, grupe rrugĂ«zimi (/api/v1, /api/v2), formate tĂ« personalizuara pĂ«r regjistrimin, shĂ«rbim tĂ« skedarĂ«ve statikĂ«, renderim HTML dhe njĂ« middleware tĂ« vĂ«rtetĂ« tĂ« fuqishĂ«m.
Vlerësoni këtë benchmark.

Krijimi i CLI => Cobra

Cobra — njĂ« bibliotekĂ« pĂ«r krijimin e aplikacioneve tĂ« fuqishme CLI, si dhe njĂ« program pĂ«r gjenerimin e aplikacioneve dhe skedarĂ«ve komandor.
Cobra përdoret në shumë projekte të mëdha Go, përfshirë Kubernetes, etcd dhe OpenShift.

Ja disa biblioteka tĂ« tjera qĂ« unĂ« i rekomandoj shumĂ«: Viper, Gonfig dhe ky listĂ« mahnitĂ«se — Awesome-Go.

Burime të tjera të dobishme

[1] Francesc Campoy  —  ju duhet tĂ« vlerĂ«soni kĂ«to YouTube dhe profil GitHub.

[2] Video GopherCon.

[3] Shembuj Go Web.

[4] Golang Weekly, Gopher Academy, Golang News — llogaritĂ« nĂ« Twitter.

Të shohim përfundimet

Duke qenë një përdorues i rregullt i Python për pesë vjet, kisha frikë se kalimi në Go do të ishte i dhimbshëm.

Por jo: ka përvoja të komunitetit Go, e cila zgjerohet dhe plotëson kapacitetet e gjuhës, si dhe burime të ndryshme të dobishme që do t'ju ndihmojnë me kalimin.

Go po zhvillohet shpejt, dhe shpresoj që Google të mund ta bëjë atë gjuhën kryesore për ndërtimin e aplikacioneve dhe infrastrukturës në re.

Bashkohuni!

Rruga ime nga Python te Go — ndaj kĂ«shilla dhe burime

Skillbox rekomandon:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster