Principes de base des canaux (Channels)
Qu'est-ce qu'un canal (Channel)?
En Go, un canal (channel) est un mécanisme de communication fondamental qui permet aux goroutines d'échanger des données de manière sûre et synchrone. Les canaux servent de conduits typés à travers lesquels vous pouvez envoyer et recevoir des valeurs, permettant ainsi des modèles de programmation concurrente.
Déclaration et initialisation des canaux (Channels)
Les canaux sont créés à l'aide de la fonction make()
avec un type spécifique et une taille de tampon (buffer) facultative :
// Canal non tamponné (unbuffered channel)
ch1 := make(chan int)
// Canal tamponné avec une capacité de 5
ch2 := make(chan string, 5)
Types de canaux (Channels)
Go prend en charge deux types de canaux principaux :
Type de canal (Channel Type) |
Description |
Comportement |
Non tamponné (Unbuffered) |
Pas de capacité |
Communication synchrone |
Tamponné (Buffered) |
A une capacité |
Communication asynchrone |
Opérations de base sur les canaux (Channels)
Envoi et réception
// Envoi d'une valeur
ch <- value
// Réception d'une valeur
value := <-ch
Visualisation du flux des canaux (Channels)
graph LR
A[Goroutine 1] -->|Send| C{Channel}
B[Goroutine 2] -->|Receive| C
Directionnalité des canaux (Channels)
Go permet de spécifier la direction d'un canal pour améliorer la sécurité des types :
// Canal d'envoi uniquement (Send-only channel)
var sendOnly chan<- int
// Canal de réception uniquement (Receive-only channel)
var receiveOnly <-chan int
Exemple pratique
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "Hello, LabEx!"
}()
msg := <-messages
fmt.Println(msg)
}
Cet exemple montre une communication de base entre des goroutines à l'aide de canaux.