Kako priljubljen je jezik Go? Tuje države, kot so Google, AWS, Cloudflare, CoreOS itd., ter domača podjetja, kot sta Qiniu in Alibaba, so začele uporabljati jezik Go za razvoj svojih izdelkov, povezanih z računalništvom v oblaku v velikem obsegu. Na katere da in ampake naj bom pozoren pri uporabi jezika Go? Nedavno smo napisali API z uporabo jezika Go, odprtokodnega programskega jezika, ki ga je Google lansiral leta 2009. Pri uporabi Go-a za razvoj smo pridobili veliko izkušenj in izkušenj, ki jih želimo deliti z bralci, zato imamo ta članek.
Pri izbiri programskega jezika za projekt vedno priporočamo, da najprej razumemo, na čem bo projekt gradil, preden razmislimo, na katerem programskem jeziku bomo gradili. Naj bo izdelek odločilni dejavnik, kako naj bo zgrajen.
Tukaj je nekaj prednosti in slabosti, ki smo jih odkrili pri razvoju z Go, da vam pomagamo razumeti, ali je primeren za vaš naslednji projekt.
Kar imamo radi pri Go
Uporaba jezika Go je v zadnjih letih eksplodirala. Zdi se, da ga uporablja vsak startup za backend sisteme. Obstaja veliko razlogov, zakaj razvijalci menijo, da je tako priljubljen.
Jezik Go je zelo hiter
Go je zelo hiter programski jezik. Ker je Go preveden v strojno kodo, naravno presega programske jezike, ki so interpretativni ali imajo virtualni čas izvajanja. Programi Go se tudi zelo hitro prevajajo in ustvarjajo zelo majhne binarne datoteke. Naš API se prevede v nekaj sekundah, kar povzroči izvršljivo datoteko, ki je majhna le 11,5 MB.
Enostavno za obvladovanje
Sintaksa jezika Go je preprosta in enostavna za razumevanje v primerjavi z drugimi jeziki. Večino sintakse Go si lahko zapomniš v glavi, kar pomeni, da ti ni treba porabiti veliko časa za iskanje stvari. Jezik Go je prav tako zelo čist in enostaven za branje. Programerji, ki ne uporabljajo Go, še posebej tisti, ki so vajeni sintakse v C-stilu, lahko berejo programsko kodo Go in razumejo, kaj se dogaja.
Statični jezik za definicijo tipov
Go je zmogljiv statični jezik za določanje tipov. Obstajajo osnovni tipi, kot so int, bajt in niz. Obstajajo tudi vrste struktur. Kot pri vsakem močno tipiziranem jeziku, sistem tipov omogoča prevajalniku, da pomaga zaznati napake za celoten razred. Jezik Go ima tudi vgrajene sezname in vrste preslikav, ki so prav tako enostavni za uporabo.
Vrsta vmesnika
Jezik Go ima tipe vmesnikov, vsaka struktura pa lahko preprosto zadovolji vmesnik z implementacijo vmesnika. To vam omogoča, da ločite odvisnosti v svoji kodi. Nato lahko simulirate svoje odvisnosti v testih. Z uporabo vmesnikov lahko napišete bolj modularno, preverljivo kodo. Jezik Go ima tudi vrhunske funkcije, kar razvijalcem omogoča pisanje kode na bolj praktičen način.
Standardna knjižnica
Jezik Go ima precej dobro standardno knjižnico. Nudi priročne vgrajene funkcije za obdelavo osnovnih tipov. Nekateri paketi omogočajo enostavno gradnjo spletnega strežnika, upravljanje vhodno-izhodnih podatkov, uporabo šifriranja in obdelavo surovih bajtov. JSON serializacija in deserializacija, ki jo omogoča standardna knjižnica, je zelo preprosta. Z uporabo "tags" lahko določite ime polja JSON poleg polja struct.
Podpora testiranju
Podpora testom je vgrajena v standardno knjižnico in ne zahteva dodatnih odvisnosti. Če imate datoteko z imenom thing.go, napišite teste v drugo datoteko z imenom thing_test.go in zaženite "go test". Go bo te teste opravil hitro.
Orodja za statično analizo
Orodja za statično analizo v jeziku Go so številna in zmogljiva. Ena posebna orodja je gofmt, ki oblikuje kodo po Go-jevem predlogu. To lahko normalizira številna mnenja projekta, kar omogoča vodji nagrajevanja ekipe, da se osredotoči na delo, ki ga je opravila koda. Na vsaki zgradbi uporabljamo gofmt, golint in vet, in če najdemo kakršnakoli opozorila, gradnja ne uspe.
Zbiranje smeti
Pri oblikovanju jezika Go je bilo upravljanje pomnilnika namenoma zasnovano tako, da je lažje kot v C in C++. Cilj dinamične dodeljevanja je zbiranje smeti. Jezik Go naredi uporabo kazalca varnejšo, saj ne dovoljuje operacij s kazalcem. Na voljo je tudi možnost uporabe vrst vrednosti.
Lažji model sočasnosti
Medtem ko sočasno programiranje nikoli ni enostavno, je Go lažje programirati hkrati kot druge jezike. Ustvarjanje lahke niti, imenovane »goroutine«, in komunikacija z njo preko »kanala« je skoraj preprosta naloga, vendar je mogoča za bolj zapletene modele.
Kaj nam ni všeč pri Go
Kot smo že prej omenili, je Go res odličen jezik. Ima čisto sintakso in je hiter za izvajanje. Ima tudi številne prednosti. A celoten programski jezik se ne nanaša le na njegovo sintakso. Tukaj je nekaj težav, s katerimi smo se srečali.
Generikov ni
Prvič, ta problem, kot slon v sobi, je očitno in spregledano dejstvo. V jeziku Go ni generikov. Za razvijalce iz jezikov, kot je Java, je prehod na Go velik izziv. To pomeni, da se stopnja ponovne uporabe kode zmanjša. Čeprav ima jezik Go vrhunske funkcije, če napišete funkcije, kot so "map", "reduce" in "filter", ki so zasnovane za delovanje na eni vrsti zbirke, teh funkcij ne morete ponovno uporabiti za druge različne vrste zbirk. Obstaja veliko načinov za rešitev tega problema, vendar vsi na koncu napišejo več kode, kar zmanjša produktivnost in vzdržljivost.
Vmesnik je impliciten
Čeprav je lepo imeti vmesnike, struktura vmesnike implementira implicitno, ne eksplicitno. To naj bi bila ena od prednosti jezika Go, vendar smo iz strukture težko ugotovili, ali implementira vmesnike ali ne. Resnično lahko razumeš le, če poskušaš program prevesti. Če je program majhen, s tem zagotovo ni nič narobe. Če pa je ta program srednjega do velikega obsega, je težava velika.
Slaba podpora knjižnicam
Podpora knjižnicam Go je neenakomerna. Naš API se integrira s Contentful, vendar slednji nima uradno podprtega Go SDK-ja. To pomeni, da moramo pisati (in vzdrževati!) Veliko kode za zahtevanje in razčlenjevanje podatkov v Contentful. Prav tako se moramo zanašati na knjižnice Elasticsearch tretjih oseb. Go SDK-ji, ki jih ponujajo ponudniki, niso tako priljubljeni kot njihovi Java, Ruby ali JavaScript ustrezniki.
Komunikacija v skupnosti je težavna
Skupnost Go morda ne sprejema predlogov. Pomislite na to v golintovem GitHub repozitoriju:Prijava do hiperpovezave je vidna., uporabnik je zahteval, da GOLINT lahko ne uspe pri sestavljanju, ko najde opozorilo (kar počnemo v projektu). Branilci so to idejo takoj zavrnili. Ker pa je preveč ljudi komentiralo težavo, so vzdrževalci po enem letu končno morali dodati zahtevane funkcije.
Zdi se, da tudi skupnost Go ne mara spletnih ogrodij. Čeprav HTTP knjižnica jezika Go pokriva številne vidike, ne podpira parametrov poti, preverjanja vhodnih podatkov in validacije, prav tako ne podpira prečnih težav, ki so pogoste v spletnih aplikacijah. Ruby razvijalci imajo Rails, Java razvijalci Spring MVC, Python razvijalci pa Django. A veliko razvijalcev Go se raje izogiba uporabi ogrodij. Vendar pa je resnica, da okvirov ni, nasprotno, jih je veliko. A ko enkrat začneš uporabljati okvir za projekt, je skoraj nemogoče izogniti se usodi opustitve.
Razdrobljeno upravljanje odvisnosti
Dolgo časa jezik Go ni imel stabilnega, formalnega upravitelja paketov. Po letih prošnje skupnosti je projekt Go šele pred kratkim izdal godep. Pred tem je bilo že veliko orodij za zapolnitev te vrzeli. V našem projektu uporabljamo zelo zmogljivega govendorja, vendar to pomeni, da je skupnost razdeljena, kar je lahko zelo zmedeno za razvijalce, ki so novi v jeziku Go. Poleg tega skoraj vsi upravljalniki paketov temeljijo na Git repozitorijih, zgodovina Git repozitorijev pa se lahko kadarkoli spremeni. Primerjaj ga z Maven Central, ki nikoli ne izbriše ali spremeni knjižnic, na katerih je tvoj projekt odvisen.
Odloči se, ali boš uporabil Go ali ne
Včasih moraš razmisliti o stroju. Ko pošiljate in prejemate bajte. Ko upravljate tisoče sočasnih procesov. Morda pišete tudi operacijski sistem, kontejnerski sistem ali blockchain vozlišče. V takih primerih vas generiki najverjetneje ne bodo zanimali. Ker si zaposlen s tem, da iz čipa iztisneš zmogljivost na nanosekundo.
Vendar pa je velikokrat treba razmisliti o ljudeh. Podatki poslovnih področij, s katerimi morate delati: stranke, zaposleni, izdelki, naročila. Morate napisati poslovno logiko, ki deluje na teh domenskih entitetah, in to morate vzdrževati več let. In mora se spoprijeti s spreminjajočimi se potrebami, in čim hitreje, tem bolje. V takih primerih je pomembna izkušnja razvijalca.
Go je programski jezik, ki ceni strojni čas bolj kot človeški čas. Včasih je v vašem poklicu zmogljivost stroja ali programa najpomembnejša. V teh primerih je Go lahko dobra alternativa za C ali C++. Ko pa pišete tipično n-tier aplikacijo, se pogosto pojavijo ozka grla v zmogljivosti v bazi podatkov in, kar je še pomembneje, v načinu modeliranja podatkov.
Pri odločitvi o uporabi jezika Go upoštevajte naslednja pravila:
- Če gre za bajte, je jezik Go morda dobra izbira.
- Če delate s podatki, potem jezik Go morda ni dobra izbira.
To se lahko nekoč spremeni. Jezik in skupnost Go sta še vedno mlada. Morda nas bodo presenetili z dodatkom generičnih zdravil; Ali pa bo priljubljen spletni okvir močno zmagal. Za zdaj pa bomo ostali pri zrelih programskih jezikih z univerzalno podporo, zrelim upravljanjem odvisnosti in osredotočenostjo na modeliranje poslovnih domen.
|