Kuinka suosittu Go-kieli on? Ulkomaiset maat, kuten Google, AWS, Cloudflare, CoreOS jne., sekä kotimaiset yritykset kuten Qiniu ja Alibaba ovat alkaneet käyttää Go-kieltä kehittääkseen pilvilaskentaan liittyviä tuotteitaan laajassa mittakaavassa. Mihin kyllä- ja muttoihin, joihin minun tulisi kiinnittää huomiota Go-kieltä käyttäessä? Äskettäin kirjoitimme API:n käyttäen Go-kieltä, avoimen lähdekoodin ohjelmointikieltä, jonka Google lanseerasi vuonna 2009. Go:n kehittämisessä olemme saaneet paljon kokemusta ja kokemuksia, ja haluamme jakaa sen lukijoiden kanssa, joten meillä on tämä artikkeli.
Kun valitset ohjelmointikieltä projektiin, suosittelemme aina ymmärtämään, mihin projekti tulee rakentamaan, ennen kuin pohdit, mihin ohjelmointikieleen rakentaa. Anna tuotteen olla ratkaiseva tekijä siinä, miten se rakennetaan.
Tässä on joitakin hyviä ja huonoja puolia, joita olemme löytäneet Go:n kehityksessä, jotta ymmärtäisit, sopiiko se hyvin seuraavaan projektiisi.
Mitä rakastamme Go:ssa
Go-kielen käyttö on räjähtänyt viime vuosina. Vaikuttaa siltä, että jokainen startup käyttää sitä taustajärjestelmässä. Kehittäjien suosion vuoksi on monia syitä.
Go-kieli on todella nopea
Go on erittäin nopea ohjelmointikieli. Koska Go käännetään konekoodiksi, se luonnollisesti päihittää ohjelmointikielet, jotka ovat tulkitsevia tai joilla on virtuaalinen ajonaika. Go-ohjelmat käännetään myös hyvin nopeasti ja tuottavat hyvin pieniä binäärejä. API:mme kääntyy vain muutamassa sekunnissa, jolloin suoritettava tiedosto on vain 11,5 MB kokoinen.
Helppo hallita
Go-kielen syntaksi on yksinkertainen ja helppo ymmärtää verrattuna muihin kieliin. Voit opetella suurimman osan Go-sanan syntaksista mielessäsi, mikä tarkoittaa, ettet joudu käyttämään paljon aikaa asioiden etsimiseen. Go-kieli on myös hyvin selkeä ja helppolukuinen. Ei-Go-ohjelmoijat, erityisesti ne, jotka ovat tottuneet C-tyyliseen syntaksiin, osaavat lukea Go-ohjelman koodia ja ymmärtää, mitä tapahtuu.
Staattinen tyyppimäärittelykieli
Go on voimakas staattinen tyyppimäärittely kieli. On perustyyppejä kuten int, tavu ja merkkijono. On myös erilaisia rakenteita. Kuten missä tahansa vahvasti tyypitetyssä kielessä, tyyppijärjestelmä mahdollistaa kääntäjän auttaa virheiden havaitsemisessa koko luokassa. Go-kielessä on myös sisäänrakennettuja lista- ja kartoitustyyppejä, ja ne ovat myös helppokäyttöisiä.
Rajapintatyyppi
Go-kielellä on rajapintatyyppejä, ja mikä tahansa rakenne voi yksinkertaisesti toteuttaa rajapinnan toteuttamalla rajapinnan. Tämä mahdollistaa riippuvuuksien irrottamisen koodissasi. Voit sitten simuloida riippuvuuksiasi kokeissasi. Käyttämällä rajapintoja voit kirjoittaa modulaarisempaa, testattavampaa koodia. Go-kielessä on myös ensiluokkaisia toimintoja, mikä mahdollistaa kehittäjille koodin kirjoittamisen käytännöllisemmin.
Standardikirjasto
Go-kielellä on melko hyvä standardikirjasto. Se tarjoaa kätevät sisäänrakennetut toiminnot perustyyppien käsittelyyn. Jotkut paketit helpottavat web-palvelimen rakentamista, I/O:n hallintaa, salauksen käyttöä ja raakatavujen käsittelyä. JSON-sarjallistaminen ja deserialisointi, jonka standardikirjasto tarjoaa, on hyvin yksinkertaista. Käyttämällä "tageja" voit määrittää JSON-kentän nimen rakennekentän viereen.
Testaustuki
Testituki on sisäänrakennettu standardikirjastoon eikä vaadi lisäriippuvuuksia. Jos sinulla on tiedosto nimeltä thing.go, kirjoita testit toiseen tiedostoon nimeltä thing_test.go ja suorita "go test". Go suorittaa nämä testit nopeasti.
Staattiset analyysityökalut
Go-kielen staattiset analyysityökalut ovat lukuisia ja tehokkaita. Yksi erityinen työkalu on gofmt, joka muotoilee koodin Go:n ehdottaman tyylin mukaan. Tämä voi normalisoida monia projektin mielipiteitä, jolloin tiimin palkintopäällikkö voi keskittyä koodin tekemiseen työhön. Käytämme gofmt-, golinti- ja vet-toimintoja jokaisessa buildissa, ja jos löydämme varoituksia, rakennelma epäonnistuu.
Jätehuolto
Go-kieltä suunniteltaessa muistinhallinta suunniteltiin tarkoituksella helpommaksi kuin C ja C++. Dynaamisen allokoinnin kohde on roskien keräys. Go-kieli tekee osoittimen käytöstä turvallisempaa, koska se ei salli osoitinoperaatioita. Vaihtoehto käyttää arvotyyppejä on myös saatavilla.
Helpompi rinnakkaismalli
Vaikka samanaikainen ohjelmointi ei ole koskaan helppoa, Go:n samanaikainen ohjelmointi on helpompaa kuin muita kieliä. Kevyen säikeen nimeltä "goroutine" luominen ja sen kanssa kommunikointi "kanavan" kautta on lähes yksinkertainen tehtävä, mutta se on mahdollista monimutkaisemmille malleille.
Mitä emme pidä Go:ssa
Kuten aiemmin keskustelimme, Go on todellakin erinomainen kieli. Siinä on puhdas syntaksi ja se on nopea toteuttaa. Sillä on myös monia etuja. Mutta koko ohjelmointikieli ei viittaa pelkästään sen syntaksiin. Tässä on joitakin ongelmia, joita kohtasimme.
Geneerisiä ei ole
Ensinnäkin tämä ongelma, kuin norsu huoneessa, on ilmeinen ja unohdettu tosiasia. Go-kielessä ei ole geneerisiä nimityksiä. Kehittäjille esimerkiksi Java-kielistä Go:hun siirtyminen on valtava haaste ylitettäväksi. Tämä tarkoittaa, että koodin uudelleenkäyttö vähenee. Vaikka Go-kielessä on ensiluokkaisia funktioita, jos kirjoitat funktioita kuten "map", "reduce" ja "filter", jotka on suunniteltu toimimaan yhdellä kokoelmatyypillä, et voi käyttää näitä funktioita uudelleen eri kokoelmiin. Tämän ongelman ratkaisemiseen on monia tapoja, mutta kaikki lopulta kirjoittavat enemmän koodia, mikä heikentää tuottavuutta ja ylläpidettävyyttä.
Rajapinta on implisiittinen
Vaikka rajapintojen olemassaolo on mukavaa, rakenne toteuttaa rajapinnat implisiittisesti eikä eksplisiittisesti. Tämän sanotaan olevan yksi Go-kielen vahvuuksista, mutta rakenteesta oli vaikea sanoa, toteuttiko se rajapinnat vai ei. Sen voi todella ymmärtää vain yrittämällä kääntää ohjelmaa. Jos ohjelma on pieni, siinä ei ole mitään väärää. Mutta jos tämä ohjelma on keskisuuri tai laajamittainen, ongelma on suuri.
Heikko kirjastotuki
Go-kirjaston tuki on epätasaista. API:mme integroituu Contentfuliin, mutta jälkimmäisellä ei ole virallisesti tuettua Go SDK:ta. Tämä tarkoittaa, että meidän täytyy kirjoittaa (ja ylläpitää!) Paljon koodia pyydettäväksi ja analysoitavaksi Contentfulissa. Meidän täytyy myös luottaa kolmannen osapuolen Elasticsearch-kirjastoihin. Toimittajien tarjoamat Go SDK:t eivät ole yhtä suosittuja kuin Java-, Ruby- tai JavaScript-vastineensa.
Yhteisöviestintä on vaikeaa
Go-yhteisö ei välttämättä hyväksy ehdotuksia. Tarkastellaan tätä Golintin GitHub-repositoriossa:Hyperlinkin kirjautuminen on näkyvissä., käyttäjä pyysi, että Golint pystyisi epäonnistumaan buildissa, kun se löysi varoituksen (kuten me teemme projektissa). Puolustajat hylkäsivät ajatuksen välittömästi. Koska liian moni kommentoi ongelmaa, vuoden jälkeen ylläpitäjien oli lopulta lisättävä pyydetyt ominaisuudet.
Go-yhteisö ei tunnu pitävän verkkokehyksistäkään. Vaikka Go-kielen HTTP-kirjasto kattaa monia osa-alueita, se ei tue polkuparametreja, syötteen tarkistusta eikä validointia, eikä myöskään verkkosovelluksissa yleisiä poikkileikkaavia huolia. Ruby-kehittäjillä on Rails, Java-kehittäjillä Spring MVC ja Python-kehittäjillä Django. Mutta monet Go-kehittäjät päättävät välttää kehysten käyttöä. Todellisuus kuitenkin on, että kehyksiä ei ole, päinvastoin, niitä on paljon. Mutta kun alat käyttää kehystä projektissa, on lähes mahdotonta välttää hylätyksi tulemisen kohtaloa.
Pirstoutunut riippuvuuden hallinta
Pitkään Go-kielellä ei ollut vakaata, muodollista pakettienhallintaa. Vuosien yhteisön anomisen jälkeen Go-projekti julkaisi godepinkin vasta äskettäin. Sitä ennen oli jo monia työkaluja tämän aukon täyttämiseen. Käytämme projektissamme erittäin tehokasta govendoria, mutta tämä tarkoittaa, että yhteisö on jakautunut, mikä voi olla hyvin hämmentävää kehittäjille, jotka ovat uusia Go-kielen parissa. Lisäksi lähes kaikki pakettienhallinnat toimivat Git-repositorioilla, ja Git-repositorioiden historia voi muuttua milloin tahansa. Vertaa sitä Maven Centraliin, joka ei koskaan poista tai muuta kirjastoja, joihin projektisi perustuu.
Päätä, käytätkö Go:ta vai et
Joskus täytyy ajatella konetta. Kun lähetät ja vastaanotat tavuja. Kun hallitset tuhansia samanaikaisia prosesseja. Saatat myös kirjoittaa käyttöjärjestelmää, konttijärjestelmää tai lohkoketjusolmua. Näissä tapauksissa et todennäköisesti välitä geneerisistä. Koska puristat suorituskykyä nanosekunnissa sirusta.
Monesti kuitenkin täytyy ajatella ihmisiä. Liiketoiminta-alueen data, jonka kanssa sinun täytyy työskennellä: asiakkaat, työntekijät, tuotteet, tilaukset. Sinun täytyy kirjoittaa liiketoimintalogiikka, joka toimii näillä domain-entiteetteillä, ja sinun täytyy ylläpitää tätä liiketoimintalogiikkaa monien vuosien ajan. Ja sen täytyy vastata muuttuviin tarpeisiin, ja mitä nopeammin, sen parempi. Näissä tapauksissa kehittäjän kokemus on tärkeä.
Go on ohjelmointikieli, joka arvostaa koneaikaa enemmän kuin ihmisaikaa. Joskus alallasi koneen tai ohjelman suorituskyky on kaikkein kriittisin. Näissä tapauksissa Go voi olla hyvä C- tai C++-vaihtoehto. Mutta kun kirjoitat tyypillistä n-tason sovellusta, suorituskykyyn liittyviä pullonkauloja syntyy usein tietokannassa ja, mikä tärkeintä, miten dataa mallinnetaan.
Kun päätät, käytätkö Go-kieltä, ota huomioon seuraavat nyrkkisäännöt:
- Jos käsittelet tavuja, Go-kieli voi olla hyvä valinta.
- Jos käsittelet dataa, Go-kieli ei välttämättä ole hyvä valinta.
Tämä saattaa muuttua jonain päivänä tulevaisuudessa. Go-kieli ja yhteisö ovat vielä nuoria. Ne saattavat yllättää meidät geneeristen lisäyksellä; Tai suosittu verkkokehys voittaa suuresti. Toistaiseksi pysymme kuitenkin kypsissä ohjelmointikielissä, joissa on universaali tuki, kypsä riippuvuuksien hallinta ja painopiste liiketoimintamallinnuksessa.
|