Waar is de Go-programmeertaal (Golang) echt goed voor?

Waar is de Go-programmeertaal (Golang) echt goed voor?

Tijdens zijn meer dan tien jaar in het wild, is de Go-taal van Google, ook bekend als Golang – met versie 1.18 uit vanaf maart 2022 – geëvolueerd van een curiositeit voor alfa-nerds tot de beproefde programmeertaal achter enkele van ‘s werelds belangrijkste cloudgerichte projecten.

Waarom werd Go gekozen door de ontwikkelaars van projecten als Docker en Kubernetes? Wat zijn de bepalende kenmerken van Go, hoe verschilt het van andere programmeertalen en voor wat voor soort projecten is het het meest geschikt om te bouwen? In dit artikel onderzoeken we de functieset van Go, de optimale gebruiksscenario’s, de weglatingen en beperkingen van de taal, en waar Go vanaf hier naartoe gaat.

Go-taal is klein en eenvoudig

Go, of Golang zoals het vaak wordt genoemd, is ontwikkeld door Google-medewerkers – voornamelijk Unix-goeroe en door Google onderscheiden ingenieur Rob Pike – maar het is strikt genomen geen ‘Google-project’. Go is eerder ontwikkeld als een door de gemeenschap geleid open source-project, aangevoerd door leiderschap met een uitgesproken mening over hoe Go moet worden gebruikt en welke richting de taal moet uitgaan.

Go is bedoeld om eenvoudig te leren, eenvoudig om mee te werken en gemakkelijk te lezen door andere ontwikkelaars. Go heeft geen grote functieset, zeker niet in vergelijking met talen als C++. Go doet denken aan C in zijn syntaxis, waardoor het relatief eenvoudig is voor oude C-ontwikkelaars om te leren. Dat gezegd hebbende, veel functies van Go, vooral de gelijktijdigheid en functionele programmeerfuncties, verwijzen naar talen zoals Erlang.

Als een C-achtige taal voor het bouwen en onderhouden van allerlei soorten platformonafhankelijke bedrijfsapplicaties, heeft Go veel gemeen met Java. En om een ​​snelle ontwikkeling van code mogelijk te maken die overal kan worden uitgevoerd, zou je een parallel kunnen trekken tussen Go en Python, hoewel de verschillen veel groter zijn dan de overeenkomsten.

Go Language heeft voor elk wat wils

De Go-documentatie beschrijft Go als “een snelle, statisch getypte, gecompileerde taal die aanvoelt als een dynamisch getypte, geïnterpreteerde taal.” Zelfs een groot Go-programma wordt binnen enkele seconden gecompileerd. Bovendien vermijdt Go veel van de overhead van C-style zoals bestanden en bibliotheken.

Go maakt het leven van de ontwikkelaar op een aantal manieren gemakkelijk.

Gaan is handig

Go is vergeleken met scripttalen zoals Python in zijn vermogen om aan veel veelvoorkomende programmeerbehoeften te voldoen. Een deel van deze functionaliteit is ingebouwd in de taal zelf, zoals “goroutines” voor gelijktijdigheid en threadachtig gedrag, terwijl extra mogelijkheden beschikbaar zijn in standaard Go-bibliotheekpakketten, zoals Go’s http-pakket. Net als Python biedt Go automatische geheugenbeheermogelijkheden, inclusief het verzamelen van afval.
In tegenstelling tot scripttalen zoals Python, compileert Go-code naar een snel draaiende native binary. En in tegenstelling tot C of C++ compileert Go extreem snel – snel genoeg om het werken met Go meer te laten voelen als werken met een scripttaal dan met een gecompileerde taal. Verder is het Go build-systeem minder complex dan dat van andere gecompileerde talen. Er zijn een paar stappen en weinig boekhouding nodig om een ​​Go-project te bouwen en uit te voeren.

Ga is snel

Go-binaries werken langzamer dan hun C-tegenhangers, maar het verschil in snelheid is voor de meeste toepassingen te verwaarlozen. Go-prestaties zijn net zo goed als C voor de overgrote meerderheid van het werk, en over het algemeen veel sneller dan andere talen die bekend staan ​​om hun snelheid van ontwikkeling (bijv. JavaScript, Python en Ruby).

Go is draagbaar

Uitvoerbare bestanden die met de Go-toolchain zijn gemaakt, kunnen op zichzelf staan, zonder standaard externe afhankelijkheden. De Go-toolchain is beschikbaar voor een breed scala aan besturingssystemen en hardwareplatforms en kan worden gebruikt om binaire bestanden op verschillende platforms te compileren.

Go is interoperabel

Go levert al het bovenstaande zonder de toegang tot het onderliggende systeem op te offeren. Go-programma’s kunnen met externe C-bibliotheken praten of native systeemaanroepen doen. In Docker werkt Go bijvoorbeeld met Linux-functies op laag niveau, cgroups en naamruimten om containermagie te bewerken.

Go wordt breed ondersteund

De Go-toolchain is vrij beschikbaar als Linux-, MacOS- of Windows-binary of als Docker-container. Go is standaard opgenomen in veel populaire Linux-distributies, zoals Red Hat Enterprise Linux en Fedora, waardoor het iets gemakkelijker is om Go-bron op die platforms te implementeren. Ondersteuning voor Go is ook sterk in veel ontwikkelomgevingen van derden, van Microsoft Visual Studio Code tot Komodo IDE van ActiveState.

Waar Go-taal het beste werkt

Geen enkele taal is geschikt voor elke baan, maar sommige talen zijn geschikt voor meer banen dan andere.

Go blinkt uit in het ontwikkelen van de volgende applicatietypes.

Cloud-native ontwikkeling

Go’s gelijktijdigheid en netwerkfuncties, en de hoge mate van draagbaarheid, maken het zeer geschikt voor het bouwen van cloud-native apps. Go werd zelfs gebruikt om verschillende hoekstenen van cloud-native computing te bouwen, waaronder Docker, Kubernetes en Istio.

Gedistribueerde netwerkdiensten

Netwerkapplicaties leven en sterven door gelijktijdigheid, en Go’s eigen gelijktijdigheidsfuncties – voornamelijk goroutines en kanalen – zijn zeer geschikt voor dergelijk werk. Daarom zijn veel Go-projecten voor netwerken, gedistribueerde functies en cloudservices: API’s, webservers, minimale frameworks voor webapplicaties en dergelijke.

Hulpprogramma’s en zelfstandige tools

Go-programma’s compileren naar binaire bestanden met minimale externe afhankelijkheden. Dat maakt ze bij uitstek geschikt voor het maken van hulpprogramma’s en andere tooling, omdat ze snel starten en gemakkelijk kunnen worden verpakt voor herdistributie. Een voorbeeld is een toegangsserver genaamd Teleport (onder andere voor SSH). Teleport kan snel en eenvoudig op servers worden geïmplementeerd door het vanaf de bron te compileren of een vooraf gebouwd binair bestand te downloaden.

Ga taalbeperkingen

Go’s eigenzinnige reeks functies heeft zowel lof als kritiek gekregen. Go is ontworpen om de fout te maken klein en gemakkelijk te begrijpen te zijn, waarbij bepaalde functies opzettelijk zijn weggelaten. Het resultaat is dat sommige functies die in andere talen gebruikelijk zijn, gewoon niet beschikbaar zijn in Go – expres.

Een al lang bestaande klacht was het ontbreken van generieke functies, waardoor een functie veel verschillende soorten variabelen kan accepteren. Jarenlang verzette het ontwikkelingsteam van Go zich tegen het toevoegen van generieke geneesmiddelen aan de taal, omdat ze een syntaxis en een reeks gedragingen wilden die de rest van Go aanvulden. Maar vanaf Go 1.18, uitgebracht begin 2022, bevat de taal nu een syntaxis voor generieke geneesmiddelen. De les die moet worden getrokken, is dat Go zelden belangrijke functies toevoegt en alleen na lang nadenken, om de brede compatibiliteit tussen versies te behouden.

Een ander potentieel nadeel van Go is de grootte van de gegenereerde binaire bestanden. Go binaries worden standaard statisch gecompileerd, wat betekent dat alles wat nodig is tijdens runtime is opgenomen in de binaire afbeelding. Deze aanpak vereenvoudigt het bouw- en implementatieproces, maar ten koste van een simpele “Hallo wereld!” met een gewicht van ongeveer 1,5 MB op 64-bits Windows. Het Go-team heeft gewerkt aan het verkleinen van die binaire bestanden bij elke volgende release. Het is ook mogelijk om Go-binaire bestanden te verkleinen met compressie of door Go’s debug-informatie te verwijderen. Deze laatste optie werkt mogelijk beter voor stand-alone gedistribueerde apps dan voor cloud- of netwerkservices, waar het hebben van foutopsporingsinformatie handig is als een service faalt.

Nog een andere aangeprezen functie van Go, automatisch geheugenbeheer, kan als een nadeel worden gezien, omdat het verzamelen van afval een bepaalde hoeveelheid verwerkingsoverhead vereist. Door het ontwerp biedt Go geen handmatig geheugenbeheer, en het verzamelen van afval in Go is bekritiseerd omdat het niet goed omgaat met de soorten geheugenbelastingen die in bedrijfstoepassingen voorkomen.

Dat gezegd hebbende, lijkt elke nieuwe versie van Go de functies voor geheugenbeheer te verbeteren. Go 1.8 bracht bijvoorbeeld aanzienlijk kortere vertragingstijden voor het ophalen van afval. Go-ontwikkelaars hebben de mogelijkheid om handmatige geheugentoewijzing te gebruiken in een C-extensie, of via een handmatige geheugenbeheerbibliotheek van derden, maar de meeste Go-ontwikkelaars geven de voorkeur aan native oplossingen voor die problemen.

De softwarecultuur rond het bouwen van rijke GUI’s voor Go-applicaties, zoals die in desktopapplicaties, is nog steeds verspreid.

De meeste Go-toepassingen zijn opdrachtregelprogramma’s of netwerkservices. Dat gezegd hebbende, werken verschillende projecten om rijke GUI’s voor Go-applicaties te brengen. Er zijn bindingen voor de GTK- en GTK3-frameworks. Een ander project is bedoeld om platform-native UI’s te bieden, hoewel deze afhankelijk zijn van C-bindingen en niet in pure Go zijn geschreven. En Windows-gebruikers kunnen lopen uitproberen. Maar er is in deze ruimte geen duidelijke winnaar of veilige langetermijnweddenschap naar voren gekomen, en sommige projecten, zoals een poging van Google om een ​​platformonafhankelijke GUI-bibliotheek te bouwen, zijn mislukt. Omdat Go door zijn ontwerp platformonafhankelijk is, is het onwaarschijnlijk dat een van deze onderdelen deel gaat uitmaken van het standaardpakket.

Hoewel Go met native systeemfuncties kan praten, is het niet ontworpen voor het maken van systeemcomponenten op een laag niveau, zoals kernels of apparaatstuurprogramma’s, of embedded systemen. De Go-runtime en de garbagecollector voor Go-applicaties zijn immers afhankelijk van het onderliggende besturingssysteem. (Ontwikkelaars die geïnteresseerd zijn in een geavanceerde taal voor dat soort werk, kunnen de Rust-taal bekijken.)

Ga taalfutures

Go’s toekomstige ontwikkeling richt zich meer op de wensen en behoeften van zijn ontwikkelaars, waarbij Go’s oppassers de taal veranderen om dit publiek beter te kunnen bedienen, in plaats van een koppig voorbeeld te geven. Een voorbeeld hiervan zijn generieke geneesmiddelen, die uiteindelijk aan de taal zijn toegevoegd na lang wikken en wegen over de beste manier om dit te doen.

Uit de Go-ontwikkelaarsenquête van 2021 bleek dat Go-gebruikers over het algemeen tevreden waren met wat de taal biedt, maar ook dat er veel ruimte voor verbetering was. De belangrijkste gebieden waarop Go-gebruikers verbeteringen wilden, waren afhankelijkheidsbeheer (een constante uitdaging in Go), het diagnosticeren van bugs en betrouwbaarheid, met problemen als geheugen, CPU-gebruik, binaire groottes en veel lagere bouwtijden.

De meeste talen worden aangetrokken door een kernset van use-cases. In het decennium dat Go bestaat, is zijn niche netwerkdiensten geworden, waar het zijn positie waarschijnlijk zal blijven uitbreiden. Over het algemeen was de belangrijkste use case die voor de taal werd genoemd het creëren van API’s of RPC-services (49%), gevolgd door gegevensverwerking (10%), webservices (10%) en CLI-applicaties (8%).

Een ander teken van de groeiende aantrekkingskracht van de Go-taal is hoeveel ontwikkelaars ervoor kiezen na evaluatie ervan. 75% van de ondervraagden die overwogen Go voor een project te gebruiken, koos de taal. Van degenen die niet voor Go kozen, waren Rust (25%), Python (17%) en Java (12%) de beste alternatieven. Elk van die talen heeft andere niches gevonden of vindt deze: Rust voor veilige en snelle systeemprogrammering; Python voor prototyping, automatisering en lijmcode; en Java voor al lang bestaande bedrijfstoepassingen.

Het valt nog te bezien hoe ver Go’s snelheid en eenvoud van ontwikkeling het zullen brengen in andere use-cases, of hoe diep Go zal doordringen in bedrijfsontwikkeling. Maar de toekomst van Go als belangrijke programmeertaal is al verzekerd – zeker in de cloud, waar de snelheid en eenvoud van Go de ontwikkeling van een schaalbare infrastructuur vergemakkelijken die op de lange termijn kan worden onderhouden.

Copyright © 2022 IDG Communications, Inc.

Leave a Reply

Your email address will not be published.