Kui populaarne on Go keel? Välisriigid nagu Google, AWS, Cloudflare, CoreOS jt ning kodumaised ettevõtted nagu Qiniu ja Alibaba on hakanud kasutama Go keelt, et arendada oma pilvearvutusega seotud tooteid suurel skaalal. Millistele jah- ja aga-küsimustele peaksin Go keele kasutamisel tähelepanu pöörama? Hiljuti kirjutasime API, kasutades Go keelt, avatud lähtekoodiga programmeerimiskeelt, mille Google käivitas 2009. aastal. Go arendamisel oleme saanud palju kogemusi ja kogemusi ning tahame seda lugejatega jagada, seega on meil see artikkel.
Programmeerimiskeelt valides soovitame alati mõista, millesse projekt ehitab, enne kui otsustada, millisele programmeerimiskeelele edasi ehitada. Las toode on otsustav tegur, kuidas seda ehitada.
Siin on mõned plussid ja miinused, mida oleme Go arendamisel leidnud, et aidata sul mõista, kas see sobib sinu järgmise projekti jaoks.
Mida me Go juures armastame
Go keele kasutamine on viimastel aastatel plahvatuslikult kasvanud. Tundub, et iga idufirma kasutab seda taustasüsteemide jaoks. Arendajad peavad seda nii populaarseks mitmel põhjusel.
Go keel on väga kiire
Go on väga kiire programmeerimiskeel. Kuna Go on kompileeritud masinkoodi, ületab see loomulikult programmeerimiskeeli, mis on tõlgendavad või millel on virtuaalne käitusaeg. Go programmid kompileerivad väga kiiresti ja toodavad väga väikeseid binaare. Meie API kompileeritakse vaid mõne sekundiga, tulemuseks on käivitatav fail, mis on nii väike kui 11,5MB.
Lihtne valdada
Go keele süntaks on lihtne ja kergesti mõistetav võrreldes teiste keeltega. Sa suudad enamiku Go süntaksist peas pähe õppida, mis tähendab, et ei pea palju aega asjade otsimisele kulutama. Go keel on samuti väga puhas ja kergesti loetav. Mitte-Go programmeerijad, eriti need, kes on harjunud C-tüüpi süntaksiga, suudavad Go programmi koodi lugeda ja mõista, mis toimub.
Staatilise tüübi definitsiooni keel
Go on võimas staatiline tüübimäärav keel. On olemas põhilised tüübid nagu int, bait ja string. On ka erinevaid struktuure. Nagu iga tugevalt tüübistatud keele puhul, võimaldab tüübisüsteem kompilaatoril aidata tuvastada vigu kogu klassi kohta. Go keeles on ka sisseehitatud nimekirja- ja kaardistustüübid ning need on samuti lihtsad kasutada.
Liidese tüüp
Go keeles on liidesetüübid ning iga struktuur saab lihtsalt liidese elluviimisega rahuldada. See võimaldab sul koodis sõltuvusi lahti ühendada. Seejärel saad oma sõltuvusi testides simuleerida. Liideste abil saab kirjutada modulaarsemat ja testitavamat koodi. Go keelel on ka esmaklassilised funktsioonid, mis võimaldavad arendajatel kirjutada koodi praktilisemal viisil.
Standardteek
Go keeles on päris hea standardteek. See pakub mugavaid sisseehitatud funktsioone põhiliste tüüpide käsitlemiseks. Mõned paketid teevad veebiserveri ehitamise, I/O haldamise, krüpteerimise ja toorbaitide manipuleerimise lihtsaks. JSON-i serialiseerimine ja deserialiseerimine standardteegi poolt on väga lihtne. Kasutades "silte", saad määrata JSON-välja nime struktuurivälja kõrvale.
Testimise tugi
Testi tugi on integreeritud standardteeki ega vaja täiendavaid sõltuvusi. Kui sul on fail nimega thing.go, kirjuta testid teise faili nimega thing_test.go ja käivita "go test". Go teeb need testid kiiresti.
Staatilise analüüsi tööriistad
Go keele staatilise analüüsi tööriistad on arvukad ja võimsad. Üks konkreetne tööriist on gofmt, mis vormindab koodi Go soovitatud stiili järgi. See võib normaliseerida paljusid projekti arvamusi, võimaldades meeskonna auhinnahalduril keskenduda koodi tehtud tööle. Me kasutame igal ehitusel gofmt, golinti ja vet'i ning kui leiame hoiatusi, siis ehitus ebaõnnestub.
Prügikorje
Go keele kujundamisel oli mäluhaldus teadlikult lihtsam kui C ja C++. Dünaamilise jaotuse objektiks on prügikogumine. Go keel muudab osuti kasutamise turvalisemaks, kuna see ei võimalda osuti operatsioone. Võimalus kasutada väärtustüüpe on samuti olemas.
Lihtsam samaaegsuse mudel
Kuigi samaaegne programmeerimine pole kunagi lihtne, on Go programmeerimine lihtsam kui teisi keeli. Kerge lõime nimega "goroutine" loomine ja sellega suhtlemine "kanali" kaudu on peaaegu lihtne ülesanne, kuid see on võimalik keerukamate mudelite puhul.
Mis meile Go juures ei meeldi
Nagu varem arutasime, on Go tõepoolest suurepärane keel. Sellel on puhas süntaks ja see on kiire teostada. Sellel on ka palju eeliseid. Aga kogu programmeerimiskeel ei viita ainult selle süntaksile. Siin on mõned probleemid, millega kokku puutusime.
Geneerikuid ei ole
Esiteks on see probleem, nagu elevant toas, ilmne ja tähelepanuta jäänud fakt. Go keeles ei ole üldisi vorme. Selliste keelte arendajatele nagu Java on Go peale üleminek suur takistus. See tähendab, et koodi taaskasutus väheneb. Kuigi Go keeles on esmaklassilised funktsioonid, siis kui kirjutad funktsioone nagu "map", "reduce" ja "filter", mis on mõeldud töötama ühe kogutüübi jaoks, ei saa sa neid funktsioone kasutada teiste erinevate kogude puhul. Selle probleemi lahendamiseks on palju viise, kuid kõik kirjutavad lõpuks rohkem koodi, mis vähendab tootlikkust ja hooldatavust.
Liides on implitsiitne
Kuigi liidesed on toredad, rakendab struktuur liidesed kaudselt, mitte otseselt. See on väidetavalt üks Go keele tugevusi, kuid meil oli raske selle struktuuri järgi aru saada, kas see rakendab liideseid või mitte. Sa saad tõeliselt aru ainult siis, kui püüad programmi kompileerida. Kui programm on väike, pole selles kindlasti midagi halba. Aga kui see programm on keskmise kuni suure ulatusega, on probleem suur.
Halb raamatukogu tugi
Go raamatukogu tugi on ebaühtlane. Meie API integreerub Contentfuliga, kuid viimasel puudub ametlikult toetatud Go SDK. See tähendab, et peame kirjutama (ja hooldama!) Contentfulis on palju koodi, mida taotleda ja andmeid analüüsida. Samuti peame toetuma kolmandate osapoolte Elasticsearchi teekidele. Tootjate poolt pakutavad Go SDK-d ei ole nii populaarsed kui nende Java, Ruby või JavaScripti versioonid.
Kogukonnaga suhtlemine on keeruline
Go kogukond ei pruugi ettepanekuid vastu võtta. Mõtle sellele Golinti GitHubi hoidlas:Hüperlingi sisselogimine on nähtav., üks kasutaja palus, et Golint saaks ehituse ebaõnnestuda, kui ta leiab hoiatuse (mida me projektis teeme). Kaitsjad lükkasid idee kohe tagasi. Kuid kuna liiga paljud inimesed kommenteerisid seda probleemi, pidid hooldajad aasta pärast lõpuks soovitud funktsioonid lisama.
Go kogukond ei tundu samuti veebiraamistikke armastavat. Kuigi Go keele HTTP-teek hõlmab paljusid aspekte, ei toeta see teeparameetreid, sisendi kontrollimist ega valideerimist ega ka veebirakendustes levinud ristlõikelisi muresid. Ruby arendajatel on Rails, Java arendajatel Spring MVC ja Pythonil Django. Kuid paljud Go arendajad eelistavad raamistikke vältida. Kuid tegelikkuses pole raamistikke, vastupidi, neid on palju. Aga kui hakkad projekti raami kasutama, on peaaegu võimatu vältida hüljatuse saatust.
Killustatud sõltuvushaldus
Pikka aega ei olnud Go keeles stabiilset ja ametlikku paketihaldurit. Pärast aastaid kogukonna palumist andis Go projekt Godepi alles hiljuti välja. Enne seda oli juba palju vahendeid selle tühimiku täitmiseks. Me kasutame oma projektis väga võimsat govendorit, kuid see tähendab, et kogukond on lõhestunud, mis võib olla väga segadust tekitav arendajatele, kes on Go keelega uued. Lisaks töötavad peaaegu kõik paketihaldurid Git-hoidlate abil ning Git-hoidlate ajalugu võib igal ajal muutuda. Võrdle seda Maven Centraliga, mis ei kustuta ega muuda kunagi teeke, millele su projekt tugineb.
Otsusta, kas kasutada Go või mitte
Mõnikord tuleb mõelda masinale. Kui sa saadad ja saad baite. Kui sa haldad tuhandeid samaaegseid protsesse. Võid kirjutada ka operatsioonisüsteemi, konteinerisüsteemi või plokiahela sõlme. Sellistel juhtudel tõenäoliselt ei huvita sa geneerilised ravimid. Sest sa pigistad kiibilt jõudlust nanosekundi kohta.
Kuid tihti tuleb mõelda inimestele. Ärivaldkonna andmed, millega pead töötama: kliendid, töötajad, tooted, tellimused. Sa pead kirjutama äriloogika, mis toimib nende domeenide üksustel, ja seda äriloogikat tuleb hoida aastaid. Ja see peab toime tulema muutuvate vajadustega, ja mida kiiremini, seda parem. Sellistel juhtudel on arendaja kogemus oluline.
Go on programmeerimiskeel, mis hindab masinaaega rohkem kui inimaega. Mõnikord on sinu valdkonnas masina või programmi jõudlus kõige kriitilisem. Sellistel juhtudel võib Go olla hea C või C++ alternatiiv. Kuid kui kirjutad tüüpilist n-tasemelist rakendust, tekivad sageli jõudluse kitsaskohad andmebaasis ja mis veelgi olulisem, kuidas andmeid modelleerida.
Kui otsustad, kas kasutada Go keelt, tasub arvestada järgmiste rusikareegleid:
- Kui tegeled baitidega, võib Go keel olla hea valik.
- Kui tegeled andmetega, siis Go keel ei pruugi olla hea valik.
See võib tulevikus muutuda. Go keel ja kogukond on alles noored. Nad võivad meid üllatada geneeriliste ravimite lisamisega; Või võidab populaarne veebipõhine raamistik suurelt. Praegu jääme siiski küpsete programmeerimiskeelte juurde, millel on universaalne tugi, küps sõltuvushaldus ja keskendumine ärivaldkonna modelleerimisele.
|