Go (programmeertaal)

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
Go
Paradigma Imperatief, gedistribueerd
Verschenen in 2009
Ontworpen door Robert Griesemer, Rob Pike, Ken Thompson
Huidige versie 1.2 (1 december 2013)
Typesysteem Sterk
Implementaties Googles gc en gccgo
Beïnvloed door o.a. C en Oberon
Besturingssysteem Linux en Mac OS X
Licentie BSD-licentie
Website http://www.golang.org/
Portaal  Portaalicoon   Informatica

Go is een programmeertaal ontwikkeld door Google. Naar eigen zeggen hebben zij deze taal al twee jaar intern in gebruik voor de ontwikkeling van verschillende Google-applicaties. De ontwikkelaars van deze taal zijn Rob Pike en Ken Thompson. De laatste is ook een van de grondleggers van Unix.

Hello world[bewerken]

Hello world in Go:

package main
 
import "fmt"
 
func main() {
	fmt.Printf("Hello, World\n")
}

Kenmerken[bewerken]

De syntaxis van Go is vergelijkbaar met die van C en soortgelijke programmeertalen, hoewel er wel enkele opvallende verschillen zijn. Bijvoorbeeld:

  • Bij de declaratie van variabelen en functieparameters wordt het type achter de naam gezet in plaats van ervoor.
  • Puntkomma's zijn, net als bij bijvoorbeeld JavaScript, niet verplicht aan het einde van een regel.
  • Openings-accolades moeten op dezelfde regel geplaatst worden als het bijbehorende statement. In het bovenstaande hello world-programma mag de accolade na func main() dus niet op de volgende regel gezet worden.

Parallel programmeren: goroutines en channels[bewerken]

Go biedt de mogelijkheid voor gedistribueerd programmeren, waarbij meerdere processen tegelijk uitgevoerd worden. Dit gebeurt door middel van goroutines (een woordspeling op coroutines) en channels.

Een goroutine is een functie die tegelijk met andere goroutines wordt uitgevoerd. Goroutines kunnen gegevens met elkaar uitwisselen via channels.

In het onderstaande voorbeeld zijn er drie processen tegelijk actief die informatie uitwisselen via een channel.

  1. package main
    
  2.  
    
  3. import "fmt"
    
  4. import "time"
    
  5. import "rand"
    
  6.  
    
  7. func a(ch chan int, i int) {
    
  8.         for  {
    
  9.                 ch <- i
    
  10.                 a := rand.Int()
    
  11.                 if a % 2 == 0 {
    
  12.                         time.Sleep(1)
    
  13.                 }
    
  14.         }
    
  15. }
    
  16.  
    
  17. func main() {
    
  18.         ch := make(chan int)
    
  19.         go a(ch,1)
    
  20.         go a(ch,2)
    
  21.         for true {
    
  22.                 a := <- ch
    
  23.                 fmt.Print(a)
    
  24.         }	
    
  25. }
    

In regel 18 wordt een nieuw channel (ch) voor integers gecreëerd. Vervolgens wordt in regel 19 functie a gestart. Het keyword go zorgt ervoor dat de functie parallel met het hoofdprogramma uitgevoerd wordt. Functie a voert een oneindige lus uit, waarbij telkens de opgeven integer i (in dit geval 1) naar het opgegeven channel (ch) geschreven wordt (regel 9). Vervolgens wacht het proces soms 1 seconde (afhankelijk van een willekeurig getal).

Na het starten van a gaat het hoofdprogramma direct verder in plaats van te wachten tot a klaar is. In regel 20 wordt er nog een versie van a gestart, maar deze versie schrijft telkens een 2 naar het channel. Er lopen nu twee coroutines, terwijl het hoofdprogramma (main) ook gewoon doorloopt.

Het hoofdprogramma voert nu in de regels 21-24 een oneindige lus uit, waarbij telkens een integer uit channel ch wordt gehaald (als het channel leeg is pauzeert het hoofdprogramma), en op het scherm geprint wordt.

Het resultaat is dat er 3 onafhankelijke processen tegelijk actief zijn die oneindig doorlopen: de 2 processen die functie a uitvoeren schrijven telkens een 1 of een 2 naar het channel en het derde proces is het hoofdprogramma dat de inhoud van het channel print. De uitvoer kan er als volgt uitzien:

12222212211112222112221112211 ....

Als er geen sprake zou zijn van een parallelle uitvoering zou het programma nooit verder komen dan de eerste aanroep van functie a en zou het resultaat een oneindige reeks enen zijn.

Externe link[bewerken]

Bronnen, noten en/of referenties