Programmering

Hva er Go-språket veldig bra for?

I løpet av sine ni år i naturen har Googles Go-språk, også kalt Golang - med versjon 1.13 ut september 2019 - utviklet seg fra å være en nysgjerrighet for alfa-geeks til å være det kamptestede programmeringsspråket bak noen av verdens viktigste sky-sentriske prosjekter.

Hvorfor ble Go valgt av utviklerne av slike prosjekter som Docker og Kubernetes? Hva er Go’s definerende egenskaper, hvordan skiller det seg fra andre programmeringsspråk, og hva slags prosjekter er det best egnet for bygging? I denne artikkelen vil vi utforske Go's funksjonssett, de optimale brukssakene, språkets mangler og begrensninger, og hvor Go kan komme hit herfra.

Go språk er lite og enkelt

Go, eller Golang som det ofte kalles, ble utviklet av Google-ansatte - hovedsakelig mangeårige Unix-guruer og Google-fornemme ingeniører Rob Pike - men det er ikke strengt tatt et "Google-prosjekt." Snarere er Go utviklet som et lokalsamfunnsledet open source-prosjekt, ledet av ledelse som har sterke meninger om hvordan Go skal brukes og retningen språket skal ta.

Go er ment å være enkel å lære, grei å jobbe med og lett å lese av andre utviklere. Go har ikke et stort funksjonssett, spesielt når det sammenlignes med språk som C ++. Go minner om C i syntaksen, noe som gjør det relativt enkelt for mangeårige C-utviklere å lære. Når det er sagt, mange funksjoner i Go, spesielt dets samtidighet og funksjonelle programmeringsfunksjoner, harker tilbake til språk som Erlang.

Som et C-lignende språk for bygging og vedlikehold av plattformsbedriftsapplikasjoner av alle slag, har Go mye til felles med Java. Og som et middel for å muliggjøre rask utvikling av kode som kan kjøre hvor som helst, kan du tegne en parallell mellom Go og Python, selv om forskjellene er langt større enn likhetene.

Go språk har noe for enhver smak

Go-dokumentasjonen beskriver Go som "et raskt, statisk skrevet, kompilert språk som føles som et dynamisk skrevet, tolket språk." Selv et stort Go-program vil kompilere i løpet av sekunder. I tillegg unngår Go mye av kostnadene til C-stil inkluderer filer og biblioteker.

Go gjør utviklernes liv enkelt på flere måter:

  • Bekvemmelighet. Go har blitt sammenlignet med skriptspråk som Python i sin evne til å tilfredsstille mange vanlige programmeringsbehov. Noe av denne funksjonaliteten er innebygd i selve språket, for eksempel "goroutines" for samtidig og trådlignende oppførsel, mens flere funksjoner er tilgjengelige i Go-standardbibliotekpakker, som Go's http-pakke. I likhet med Python, tilbyr Go automatiske minnehåndteringsfunksjoner, inkludert søppeloppsamling.

    I motsetning til skriptspråk som Python, kompileres Go-koden til en hurtigløpende, naturlig binær. Og i motsetning til C eller C ++, kompilerer Go ekstremt raskt — raskt nok til at arbeidet med Go føles mer som å jobbe med et skriptspråk enn et kompilert språk. Videre er Go build-systemet mindre komplekst enn for andre kompilerte språk. Det tar få skritt og lite bokføring å bygge og kjøre et Go-prosjekt.

  • Hastighet. Go-binærfiler kjører saktere enn deres C-kolleger, men forskjellen i hastighet er ubetydelig for de fleste applikasjoner. Go-ytelse er like bra som C for de aller fleste arbeid, og generelt mye raskere enn andre språk som er kjent for utviklingshastighet (f.eks. JavaScript, Python og Ruby).
  • Bærbarhet. Kjørbare filer opprettet med Go-verktøykjeden kan stå alene, uten eksterne eksterne avhengigheter. Go-verktøykjeden er tilgjengelig for et bredt utvalg av operativsystemer og maskinvareplattformer, og kan brukes til å kompilere binærfiler på tvers av plattformer.
  • Interoperabilitet. Go leverer alt det ovennevnte uten å ofre tilgangen til det underliggende systemet. Go-programmer kan snakke med eksterne C-biblioteker eller ringe systemanrop. I Docker, for eksempel, Go-grensesnitt med lavt nivå Linux-funksjoner, cgroups og navneområder, for å arbeide container magi.
  • Brukerstøtte. Go-verktøykjeden er fritt tilgjengelig som en Linux-, MacOS- eller Windows-binær eller som en Docker-container. Go er inkludert som standard i mange populære Linux-distribusjoner, for eksempel Red Hat Enterprise Linux og Fedora, noe som gjør det noe enklere å distribuere Go-kilde til disse plattformene. Støtten for Go er også sterk i mange tredjeparts utviklingsmiljøer, fra Microsoft Visual Studio Code til ActiveStates Komodo IDE.

Where Go-språket fungerer best

Intet språk passer for hver jobb, men noen språk passer for flere jobber enn andre.

Go skinner klarest for å utvikle følgende applikasjonstyper:

  • Distribuerte nettverkstjenester.Nettverksapplikasjoner lever og dør av samtidighet, og Go's opprinnelige samtidighetsfunksjoner - hovedsakelig goroutiner og kanaler - er godt egnet for slikt arbeid. Derfor er mange Go-prosjekter for nettverk, distribuerte funksjoner og skytjenester: APIer, webservere, minimale rammer for webapplikasjoner og lignende.
  • Cloud-native utvikling.Go's samtidige funksjoner og nettverksfunksjoner, og dens høye grad av bærbarhet, gjør det godt egnet for å bygge skyinnfødte apper. Go ble faktisk brukt til å bygge flere hjørnesteiner i cloud-native databehandling, inkludert Docker, Kubernetes og Istio.
  • Utskifting av eksisterende infrastruktur.Mye av programvaren vi er avhengige av for internettinfrastrukturen eldes og skytes gjennom med utnyttelser. Omskriving av slike ting i Go gir mange fordeler - bedre minnesikkerhet, enklere distribusjon på tvers av plattformer og en ren kodebase for å fremme fremtidig vedlikehold. En ny SSH-server kalt Teleport og en ny versjon av Network Time Protocol blir skrevet i Go og tilbys som erstatning for deres konvensjonelle kolleger.
  • Verktøy og frittstående verktøy.Go-programmer kompileres til binære filer med minimale eksterne avhengigheter. Det gjør dem ideelt for å lage verktøy og annet verktøy, fordi de starter raskt og lett kan pakkes opp for omfordeling.

Gå språkbegrensninger

Go’s meningsfulle sett med funksjoner har tiltrukket både ros og kritikk. Go er designet for å feile på siden av å være liten og lett å forstå, med visse funksjoner som bevisst er utelatt. Resultatet er at noen funksjoner som er vanlige på andre språk, ganske enkelt ikke er tilgjengelige i Go - med vilje.

En slik funksjon er generiske, som tillater en funksjon å akseptere mange forskjellige typer variabler. Go inkluderer ikke generiske stoffer, og forvalterne av språket er imot å legge dem til, på grunnlag av at generikk vil kompromittere språkets enkelhet. Det er mulig å omgå denne begrensningen, men mange utviklere klør fremdeles for å se generiske legemidler lagt til Go på en eller annen måte. Minst ett forslag for implementering av generiske legemidler i Go er tatt opp, men ingenting er satt i stein.

En annen ulempe med Go er størrelsen på de genererte binærfiler. Go-binærfiler er statisk samlet som standard, noe som betyr at alt som trengs ved kjøretid er inkludert i det binære bildet. Denne tilnærmingen forenkler byggings- og distribusjonsprosessen, men på bekostning av en enkel "Hallo verden!" veier inn på rundt 1,5 MB på 64-biters Windows. Go-teamet har jobbet for å redusere størrelsen på disse binærfilene med hver påfølgende utgivelse. Det er også mulig å krympe Go-binærfiler med komprimering eller ved å fjerne Go's feilsøkingsinformasjon. Dette siste alternativet kan fungere bedre for frittstående distribuerte apper enn for sky- eller nettverkstjenester, der det er nyttig å feilsøke informasjon hvis en tjeneste mislykkes på plass.

Nok en annen fremhevet funksjon av Go, automatisk minnehåndtering, kan sees på som en ulempe, ettersom søppelinnsamling krever en viss mengde behandlingskostnader. Av design gir Go ikke manuell minnehåndtering, og søppelinnsamling i Go har blitt kritisert for ikke å håndtere de typer minnebelastninger som vises i bedriftsapplikasjoner. På plussiden gir Go 1.8 mange forbedringer i minnestyring og søppeloppsamling som reduserer forsinkelsestiden. Selvfølgelig har Go-utviklere muligheten til å bruke manuell minnetildeling i en C-utvidelse, eller ved hjelp av et tredjeparts manuelt minneadministrasjonsbibliotek.

Programvarekulturen rundt å bygge rike GUIer for Go-applikasjoner, for eksempel de i stasjonære applikasjoner, er fortsatt spredt.

De fleste Go-applikasjoner er kommandolinjeverktøy eller nettverkstjenester. Når det er sagt, jobber ulike prosjekter med å bringe rike GUIer for Go-applikasjoner. Det er bindinger for GTK- og GTK3-rammeverket. Et annet prosjekt er ment å gi plattforminnfødte brukergrensesnitt, selv om disse er avhengige av C-bindinger og ikke er skrevet i ren Go. Og Windows-brukere kan prøve å gå. Men ingen klar vinner eller sikker langsiktig innsats har dukket opp i dette rommet, og noen prosjekter, for eksempel et Google-forsøk på å bygge et GUI-bibliotek på tvers av plattformer, har gått langs veien. Også fordi Go er plattformuavhengig av design, er det lite sannsynlig at noen av disse blir en del av standardpakningssettet.

Selv om Go kan snakke med innfødte systemfunksjoner, var den ikke designet for å lage systemkomponenter på lavt nivå, for eksempel kjerner eller enhetsdrivere eller innebygde systemer. Tross alt er Go-kjøretiden og søppeloppsamleren for Go-applikasjoner avhengig av det underliggende operativsystemet. (Utviklere som er interessert i et banebrytende språk for den slags arbeid, kan se på Rust-språket.)

Gå språk futures

Den neste fasen i Go-utviklingen kan godt drives av behovene og behovene til utviklerbasen, med Go's minders som endrer språket for å bedre imøtekomme dette publikummet, i stedet for bare å lede med sta eksempel. Med andre ord kan Go få funksjonene som opprinnelig ikke var ment for det, som generikk.

Det er klart Golang-utviklere vil ha disse tingene. Brukerundersøkelsen fra 2018 plasserte generikk blant de tre beste utfordringene i veien for bredere Go-adopsjon, sammen med bedre avhengighet og pakkehåndtering. Og et eksisterende forslag på GitHub for generiske stoffer forblir aktivt som et forslag til Go 2.x. Endringer som disse kan hjelpe Go med å ta en mer sentral plass i bedriftsutviklingen, der Java, JavaScript og Python for tiden hersker.

Selv uten store endringer, kan vi forvente økt bruk av Go for å bygge om infrastrukturprosjekter, i henhold til erstatningene for SSH og NTP beskrevet ovenfor, og som en del av flerspråklige prosjekter.

Tredjeparts implementeringer av Go-verktøykjeden har også spredt seg. ActiveStates ActiveGo tilbyr en kommersielt støttet utgave av Go-språket, og både LLVM- og gccgo-prosjektene gir liberalt lisensierte open source-implementeringer av Go ved hjelp av alternative verktøykjeder.

Endelig har Go også tjent som en base for å utvikle helt nye språk, selv om to eksempler på dette har opphørt aktiv utvikling. Et eksempel var Have-språket, som strømlinjeformet Go-syntaksen, implementerte noen av de samme konseptene på sin egen måte og ble sendt til Go for enkel utførelse. Et annet nedlagt prosjekt, Oden, brukte Go’s montør og verktøykjede til å kompilere et nydesignet språk som hentet ekstra inspirasjon fra språk som Lisp og Haskell.

Dette siste settet med prosjekter illustrerer en av måtene en hvilken som helst IT-innovasjon blir virkelig revolusjonerende på - når folk tar den fra hverandre og bruker den på nytt, og finner bruksområder som designerne aldri har ment. Fremtiden for Go-språket som et hackbart prosjekt er akkurat i gang. Men fremtiden som et stort programmeringsspråk er allerede sikret, absolutt i skyen, hvor hastigheten og enkelheten til Go letter utviklingen av skalerbar infrastruktur som kan opprettholdes i det lange løp.