Programmering

Hvad er Go-sproget rigtig godt til?

I løbet af sine ni år i naturen har Googles Go-sprog, alias Golang - med version 1.13 fra september 2019, udviklet sig fra at være en nysgerrighed for alfa-nørder til at være det kamptestede programmeringssprog bag nogle af verdens vigtigste sky-centrerede projekter.

Hvorfor blev Go valgt af udviklerne af sådanne projekter som Docker og Kubernetes? Hvad er Go's definerende egenskaber, hvordan adskiller det sig fra andre programmeringssprog, og hvilke slags projekter er det bedst egnet til bygning? I denne artikel vil vi undersøge Go's funktionssæt, de optimale brugssager, sprogets udeladelser og begrænsninger, og hvor Go kan komme hen herfra.

Go sprog er lille og simpelt

Go, eller Golang, som det ofte kaldes, blev udviklet af Google-medarbejdere - hovedsagelig Unix-guru og Google-fornemme ingeniør Rob Pike - men det er ikke strengt taget et "Google-projekt". Snarere er Go udviklet som et community-ledet open source-projekt, ledet af lederskab, der har stærke meninger om, hvordan Go skal bruges, og hvilken retning sproget skal tage.

Go er beregnet til at være enkel at lære, ligetil at arbejde med og let at læse af andre udviklere. Go har ikke et stort funktionssæt, især når man sammenligner med sprog som C ++. Go minder om C i sin syntaks, hvilket gør det relativt let for mangeårige C-udviklere at lære. Når det er sagt, går mange funktioner i Go, især dets samtidighed og funktionelle programmeringsfunktioner, tilbage til sprog som Erlang.

Som et C-lignende sprog til opbygning og vedligeholdelse af forskellige applikationer på tværs af platforme har Go meget til fælles med Java. Og som et middel til at muliggøre hurtig udvikling af kode, der muligvis kører overalt, kan du trække en parallel mellem Go og Python, selvom forskellene er langt større end lighederne.

Go sprog har noget for enhver smag

Go-dokumentationen beskriver Go som "et hurtigt, statisk skrevet, kompileret sprog, der føles som et dynamisk skrevet, fortolket sprog." Selv et stort Go-program kompileres i løbet af få sekunder. Plus undgår Go meget af omkostningerne ved C-stil inkluderer filer og biblioteker.

Go gør udviklerens liv let på en række måder:

  • Bekvemmelighed. Go er blevet sammenlignet med scriptsprog som Python i dets evne til at tilfredsstille mange almindelige programmeringsbehov. Noget af denne funktionalitet er indbygget i selve sproget, såsom "goroutines" til samtidig og trådlignende adfærd, mens yderligere funktioner er tilgængelige i Go-standardbibliotekspakker, som Go's http-pakke. Ligesom Python giver Go automatisk kapacitet til hukommelsesadministration inklusive skraldopsamling.

    I modsætning til scripting-sprog som Python kompileres Go-kode til et hurtigt kørende native-binærsystem. Og i modsætning til C eller C ++ kompileres Go ekstremt hurtigt — hurtigt nok til at arbejde med Go føles mere som at arbejde med et script-sprog end et kompileret sprog. Desuden er Go build-systemet mindre komplekst end andre kompilerede sprog. Det tager få skridt og lidt bogføring for at opbygge og køre et Go-projekt.

  • Fart. Go-binærfiler kører langsommere end deres C-kolleger, men forskellen i hastighed er ubetydelig for de fleste applikationer. Go-ydeevne er lige så god som C for langt størstedelen af ​​arbejdet og generelt meget hurtigere end andre sprog kendt for udviklingshastighed (f.eks. JavaScript, Python og Ruby).
  • Bærbarhed. Eksekverbare enheder oprettet med Go-værktøjskæden kan stå alene uden nogen eksterne eksterne afhængigheder. Go-værktøjskæden er tilgængelig til en lang række operativsystemer og hardwareplatforme og kan bruges til at kompilere binære filer på tværs af platforme.
  • Interoperabilitet. Go leverer alt det ovenstående uden at ofre adgangen til det underliggende system. Go-programmer kan tale med eksterne C-biblioteker eller foretage native systemopkald. I Docker, for eksempel, går Go-grænseflader med lavt niveau Linux-funktioner, cgroups og navneområder for at arbejde med containermagi.
  • Support. Go-værktøjskæden er frit tilgængelig som en Linux-, MacOS- eller Windows-binær eller som en Docker-container. Go er inkluderet som standard i mange populære Linux-distributioner, såsom Red Hat Enterprise Linux og Fedora, hvilket gør det noget lettere at implementere Go-kilde til disse platforme. Support til Go er også stærk på tværs af mange tredjepartsudviklingsmiljøer, fra Microsoft Visual Studio Code til ActiveStates Komodo IDE.

Where Go-sproget fungerer bedst

Intet sprog passer til hvert job, men nogle sprog passer til flere job end andre.

Go skinner klarest til udvikling af følgende applikationstyper:

  • Distribuerede netværkstjenester.Netværksapplikationer lever og dør ved samtidighed, og Go's native samtidige funktioner - goroutines og kanaler, hovedsageligt - er velegnede til sådant arbejde. Derfor er mange Go-projekter til netværk, distribuerede funktioner og cloud-tjenester: API'er, webservere, minimale rammer til webapplikationer og lignende.
  • Cloud-native udvikling.Go's samtidige og netværksfunktioner og dens høje grad af bærbarhed gør det velegnet til opbygning af cloud-native apps. Faktisk blev Go brugt til at bygge flere hjørnesten i cloud-native computing, herunder Docker, Kubernetes og Istio.
  • Udskiftninger af eksisterende infrastruktur.Meget af den software, vi er afhængige af til internetinfrastruktur, bliver ældre og gennemskudt med bedrifter. Omskrivning af sådanne ting i Go giver mange fordele - bedre hukommelsessikkerhed, lettere implementering på tværs af platforme og en ren kodebase for at fremme fremtidig vedligeholdelse. En ny SSH-server kaldet Teleport og en ny version af Network Time Protocol skrives i Go og tilbydes som erstatning for deres konventionelle kolleger.
  • Hjælpeprogrammer og enkeltstående værktøjer.Go-programmer kompileres til binære filer med minimale eksterne afhængigheder. Det gør dem ideel til at oprette hjælpeprogrammer og andet værktøj, fordi de starter hurtigt og let kan pakkes op til omfordeling.

Gå sprogbegrænsninger

Go's meningsfulde sæt funktioner har tiltrukket både ros og kritik. Go er designet til at fejle på siden af ​​at være lille og let at forstå, med visse funktioner bevidst udeladt. Resultatet er, at nogle funktioner, der er almindelige på andre sprog, simpelthen ikke er tilgængelige i Go - med vilje.

En sådan funktion er generiske, som tillader en funktion at acceptere mange forskellige typer variabler. Go inkluderer ikke generiske stoffer, og sprogets forvaltere er imod at tilføje dem på det grundlag, at generiske stoffer kompromitterer sprogets enkelhed. Det er muligt at omgå denne begrænsning, men mange udviklere klør stadig for at se generiske stoffer tilføjet Go på en eller anden måde. Mindst et forslag til implementering af generiske lægemidler i Go er blevet rejst, men intet er sat i sten.

En anden ulempe ved Go er størrelsen på de genererede binære filer. Go-binærfiler er statisk kompileret som standard, hvilket betyder, at alt, hvad der er nødvendigt ved kørsel, er inkluderet i det binære billede. Denne tilgang forenkler opbygnings- og implementeringsprocessen, men på bekostning af et simpelt "Hej verden!" vejer ca. 1,5 MB på 64-bit Windows. Go-teamet har arbejdet for at reducere størrelsen på disse binære filer med hver efterfølgende frigivelse. Det er også muligt at formindske Go-binære filer med komprimering eller ved at fjerne Go's fejlretningsoplysninger. Denne sidste mulighed fungerer muligvis bedre for enkeltstående distribuerede apps end for sky- eller netværkstjenester, hvor det er nyttigt at have fejlretningsoplysninger, hvis en tjeneste ikke fungerer.

Endnu et andet udråbt træk ved Go, automatisk hukommelsesstyring, kan ses som en ulempe, da affaldsindsamling kræver en vis mængde behandlingsomkostninger. Som design leverer Go ikke manuel hukommelsesstyring, og affaldsindsamling i Go er blevet kritiseret for ikke at håndtere de slags hukommelsesbelastninger, der vises i virksomhedens applikationer. På plussiden bringer Go 1.8 mange forbedringer af hukommelsesadministration og affaldsindsamling, der reducerer den involverede forsinkelse. Selvfølgelig har Go-udviklere evnen til at bruge manuel hukommelsesallokering i en C-udvidelse eller ved hjælp af et tredjeparts manuelt hukommelsesstyringsbibliotek.

Softwarekulturen omkring opbygning af rige GUI'er til Go-applikationer, såsom dem i desktop-applikationer, er stadig spredt.

De fleste Go-applikationer er kommandolinjeværktøjer eller netværkstjenester. Når det er sagt, arbejder forskellige projekter på at bringe rige GUI'er til Go-applikationer. Der er bindinger til GTK- og GTK3-rammerne. Et andet projekt er beregnet til at levere platform-native brugergrænseflader, selvom disse er afhængige af C-bindinger og ikke er skrevet i ren Go. Og Windows-brugere kan prøve at gå. Men der er ikke kommet nogen klar vinder eller sikker langsigtet indsats i dette rum, og nogle projekter, såsom et Google-forsøg på at opbygge et GUI-bibliotek på tværs af platforme, er gået af vejen. Også fordi Go er platformuafhængigt af design, er det usandsynligt, at nogen af ​​disse bliver en del af standardpakningssættet.

Selvom Go kan tale med oprindelige systemfunktioner, var det ikke designet til at oprette systemkomponenter på lavt niveau, såsom kerner eller enhedsdrivere eller indlejrede systemer. Go-runtime og affaldssamleren til Go-applikationer er trods alt afhængige af det underliggende operativsystem. (Udviklere, der er interesseret i et banebrydende sprog til den slags arbejde, kan se på Rust-sproget.)

Gå sprog futures

Den næste fase i Go-udviklingen kan godt være mere drevet af ønsker og behov hos udviklerbasen, hvor Go's mindere ændrer sproget for bedre at imødekomme dette publikum, snarere end blot at lede ved stædige eksempler. Med andre ord kan Go muligvis få de funktioner, der oprindeligt ikke var beregnet til det, som generiske stoffer.

Det er klart Golang-udviklere vil have disse ting. Go-brugerundersøgelsen fra 2018 placerede generika blandt de tre bedste udfordringer i vejen for bredere Go-adoption sammen med bedre afhængighed og pakkehåndtering. Og et eksisterende forslag om GitHub til generiske stoffer forbliver aktivt som et forslag til Go 2.x. Ændringer som disse kan hjælpe Go med at tage en mere central plads i virksomhedsudvikling, hvor Java, JavaScript og Python i øjeblikket hersker.

Selv uden større ændringer kan vi forvente øget brug af Go til genopbygning af infrastrukturprojekter i henhold til erstatningerne for SSH og NTP beskrevet ovenfor og som en del af flersprogede projekter.

Tredjeparts implementeringer af Go-værktøjskæden er også spredt. ActiveStates ActiveGo leverer en kommercielt understøttet udgave af Go-sproget, og både LLVM- og gccgo-projekterne giver liberalt licenseret open source-implementeringer af Go ved hjælp af alternative værktøjskæder.

Endelig har Go også fungeret som en base for udvikling af helt nye sprog, selvom to eksempler på dette er ophørt med aktiv udvikling. Et eksempel var Have-sproget, som strømlinede Go-syntaksen, implementerede nogle af de samme koncepter på sin egen måde og transpilerede til Go for nem udførelse. Et andet afviklet projekt, Oden, brugte Go's montør og værktøjskæde til at kompilere et nydesignet sprog, der tog yderligere inspiration fra sprog som Lisp og Haskell.

Dette sidste sæt projekter illustrerer en af ​​måderne, hvorpå enhver IT-innovation bliver virkelig revolutionerende - når folk adskiller den fra hinanden og genbruger den, finder de anvendelser, som dens designere aldrig har tænkt sig. Fremtiden for Go-sproget som et hackbart projekt er lige ved at komme i gang. Men dens fremtid som et stort programmeringssprog er allerede sikret, bestemt i skyen, hvor Go's hastighed og enkelhed letter udviklingen af ​​skalerbar infrastruktur, der kan opretholdes i det lange løb.