Hostinger

Les channels dans Go

Communication entre goroutines

Maintenant que nous savons ce que sont les goroutines, voyons comment elles peuvent communiquer entre elles. C’est ici que les channels entrent en jeu. Dans le langage Go, les channels sont des mécanismes sûrs et synchronisés pour transférer des données entre goroutines.

Un channel est comme un tuyau à travers lequel les goroutines peuvent envoyer et recevoir des valeurs.

Illustration channel en Go

Pour créer un channel, on utilise la fonction make avec le type de données que le channel va transporter.

Voyons ensemble un exemple simple où nous utilisons un channel pour transmettre un message entre la routine principale et une goroutine :

package main

import (
    "fmt"
)

// Fonction qui envoie un message sur un channel
func sendMessage(ch chan string) {
    ch <- "Hello depuis la goroutine"
}

func main() {
    // Création d'un channel de type string
    messageChannel := make(chan string)

    // Lancement d'une goroutine qui envoie un message
    go sendMessage(messageChannel)

    // Réception du message depuis le channel
    msg := <-messageChannel
    fmt.Println("Message reçu :", msg)
}

Dans cet exemple, nous avons un channel messageChannel de type string. La fonction sendMessage envoie un message sur ce channel avec ch <- 'Hello depuis la goroutine'. Dans la fonction main, nous recevons ce message avec msg := <-messageChannel et l’affichons.

Communication bidirectionnels ou unidirectionnels

Les channels peuvent également être bidirectionnels ou unidirectionnels.

Par défaut, un channel est bidirectionnel, ce qui signifie qu’il peut envoyer et recevoir des données. Vous pouvez également spécifier un channel comme étant uniquement pour l’envoi ou la réception, ce qui renforce la sécurité du code.

Voyons un autre exemple où nous utilisons un channel pour transférer des données entre deux goroutines :

package main

import (
    "fmt"
)

// Fonction pour envoyer des nombres sur un channel
func sendNumbers(ch chan int) {
    for i := 1; i <= 5; i++ {
        ch <- i
    }
    close(ch) // Ferme le channel après l'envoi des données
}

// Fonction pour recevoir des nombres depuis un channel
func receiveNumbers(ch chan int) {
    for num := range ch {
        fmt.Println("Reçu :", num)
    }
}

func main() {
    numbersChannel := make(chan int)

    go sendNumbers(numbersChannel)
    receiveNumbers(numbersChannel)
}

Dans cet exemple, la fonction sendNumbers envoie les nombres de 1 à 5 sur le channel numbersChannel, puis ferme le channel avec close(ch). La fonction receiveNumbers reçoit les nombres depuis le channel et les affiche jusqu’à ce que le channel soit fermé.

L’utilisation de range ch dans la boucle permet de recevoir automatiquement les valeurs jusqu’à ce que le channel soit fermé, évitant ainsi les blocages potentiels.

Tapez la commande suivante :

go run main.go

Voici le résultat :

Reçu : 1
Reçu : 2
Reçu : 3
Reçu : 4
Reçu : 5

Les channels sont essentiels pour écrire du code concurrent en Go, car ils offrent un moyen sûr et efficace de synchroniser les goroutines et de partager des données entre elles.