Canaux

Canaux #

// Les _canaux_ (channels) sont des tuyaux qui relient
// des goroutines concurrentes. On peut envoyer des
// valeurs d'une goroutine à une autre via un canal

package main

import "fmt"

func main() {

    // On crée un nouveau canal avec `make(chan val-type)`.
    // Les canaux sont typés avec les valeurs qu'ils
    // transportent.
    messages := make(chan string)

    // On _envoie_ une valeur dans un canal avec la
    // syntaxe `canal <-`. Ici on envoie `"ping"`  dans
    // le canal `messages` que l'on a créé au dessus,
    // depuis une nouvelle goroutine.
    go func() { messages <- "ping" }()

    // La syntaxe`<-canal` _recoit une valeur depuis un
    // canal.
    // Ici on affiche le message `"ping"` envoié au
    // dessus, et l'affiche.
    msg := <-messages
    fmt.Println(msg)
}
# Lorsque l'on lance le programme, le message `"ping"` 
# est correctement passé d'une goroutine à l'autre via
# notre canal.
$ go run channels.go 
ping

# Par défaut, l'envoi et la réception de messages bloque
# jusqu'à ce que l'envoyeur et le receveur soient prêts.
# Cette propriété nous a permis d'attendre le message 
# `"ping"` à la fin de notre programme, sans utiliser
# une autre forme de synchronisation.