Wat is de programmeertaal Go en wat kun je ermee?

Auteur: Gepubliceerd

Kort samengevat: Go is een programmeertaal voor algemeen gebruik, ontwikkeld bij Google en verder ontwikkeld als opensourceproject. De taal wordt vooral gebruikt voor serverdiensten, terminaltools en infrastructuursoftware. Go combineert een relatief eenvoudige syntaxis met compilatie naar machinecode en ingebouwde mechanismen voor concurrency: het organiseren van meerdere taken waarvan de uitvoering elkaar in de tijd kan overlappen.

Waarin verschilt Go van andere talen?

De officiële naam van de taal is Go, al kom je in zoekmachines en gesprekken ook de term ‘Golang’ tegen. Daarmee wordt geen andere versie of afzonderlijke technologie bedoeld. Go heeft ook niets te maken met het gelijknamige bordspel.

Go is statisch getypeerd: gegevenstypen worden tijdens het compileren gecontroleerd, voordat het programma wordt uitgevoerd. De compiler zet de broncode om in een programma voor het gekozen besturingssysteem en de gekozen processorarchitectuur. Daarbij worden sommige fouten vroeg opgespoord, bijvoorbeeld wanneer je tekst probeert te gebruiken waar een getal vereist is.

De taal geeft geheugen dat het programma niet meer nodig heeft automatisch vrij. Dat gebeurt via een mechanisme dat de garbage collector heet. De programmeur hoeft niet elk geheugengebied handmatig vrij te geven, maar moet nog steeds het resourcegebruik bewaken en bestanden en verbindingen sluiten.

Go heeft bewust een beperkt aantal taalconstructies. Het biedt geen klassieke overerving van klassen zoals in Java; om gegevens en gedrag te organiseren gebruikt het onder meer structs en interfaces. Fouten worden meestal teruggegeven als waarden die de aanroepende code expliciet moet controleren.

Waarvoor wordt Go gebruikt?

Go is geschikt voor programma’s die netwerkverkeer afhandelen, verzoeken verwerken en verschillende systemen met elkaar verbinden. De standaardbibliotheek biedt onder meer ondersteuning voor HTTP, JSON, bestanden en tests. Daardoor kun je veel basistaken uitvoeren zonder een uitgebreide verzameling aanvullende bibliotheken.

Typische toepassingen zijn:

Een webwinkel kan bijvoorbeeld een afzonderlijke dienst in Go hebben die de verzendstatus bij verschillende vervoerders opvraagt en een uniform antwoord beschikbaar stelt aan het klantenportaal. Go is hier een logische keuze vanwege de netwerktools en de ondersteuning voor concurrente bewerkingen. De taal zelf lost echter geen problemen op met limieten van externe API, storingen of fouten in de logica voor bestellingen.

Hoe werkt concurrency in Go?

Het belangrijkste mechanisme voor concurrency in Go zijn goroutines: lichte taken die door de runtime van de taal worden beheerd. Door go vóór een functieaanroep te zetten, kan die functie concurrent met andere taken worden uitgevoerd. Een goroutine is geen afzonderlijke thread van het besturingssysteem; de Go-runtime plant de uitvoering van goroutines op threads.

Taken kunnen met elkaar communiceren via kanalen: een mechanisme om waarden door te geven en werkzaamheden te synchroniseren. Er zijn ook locks beschikbaar om gedeelde gegevens te beschermen. Het gebruik van goroutines neemt het risico op deadlocks of onveilige gelijktijdige toegang tot het geheugen niet automatisch weg.

Stel dat een programma de bereikbaarheid van tien websites moet controleren. Bij een sequentiële aanpak wacht het op het antwoord van de ene website voordat het de volgende opvraagt. Met concurrency kan het meerdere controles starten en tegelijkertijd op de resultaten wachten, met een ingestelde verbindingslimiet en time-out.

Concurrency is niet hetzelfde als parallellisme. Het eerste gaat over het organiseren van taken, het tweede over het daadwerkelijk gelijktijdig uitvoeren ervan, bijvoorbeeld op meerdere processorkernen. Meer goroutines garanderen geen sneller programma: de database, de netwerkbandbreedte of de overhead van synchronisatie kan de beperkende factor zijn.

Wanneer kies je Go en wanneer een andere taal?

Go is een goede kandidaat als je een zelfstandige netwerkdienst of tool bouwt die eenvoudig op servers moet kunnen draaien. Vaak kun je één uitvoerbaar bestand leveren zonder een aparte interpreter te installeren. Dat geldt niet altijd: het gebruik van C-bibliotheken of externe bestanden kan extra afhankelijkheden met zich meebrengen.

In de volgende situaties kan een andere taal praktischer zijn:

Dit zijn richtlijnen, geen ranglijst van programmeertalen. Houd bij je keuze rekening met de beschikbare bibliotheken, de ervaring van het team en de eisen van het specifieke programma.

Hoe begin je met Go?

Installeer de huidige stabiele versie volgens de instructies op de officiële website van het Go-project en controleer de vereisten voor je systeem. Controleer daarna de installatie met het commando go version en maak een map voor je eerste project.

Sla daarin het bestand main.go op:

package main

import "fmt"

func main() {
    fmt.Println("Hallo, Go!")
}

Voer in de terminal go mod init voorbeeld/hallo uit om een module aan te maken: een eenheid waarmee je het project organiseert en zijn afhankelijkheden beheert. Het commando go run . compileert het programma en voert het uit; go build . maakt een uitvoerbaar bestand. Met go fmt ./... formatteer je de code en met go test ./... voer je tests uit.

Bouw als volgende oefening een programma dat de HTTP-status van één website controleert. Voeg foutafhandeling en een time-out toe en breid het pas daarna uit om meerdere adressen concurrent te controleren.

Zie ook: Wat is 2FA?

Lees ook

Lees hoe PHP-FPM PHP-verzoeken verwerkt, verschilt van een webserver en hoe je processen afstemt op verkeer en hostingcapaciteit.
Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.