Junior — Middle
Comment déterminer laquelle des goroutines se terminera avec le canal?
sobes.tech IA
Réponse de l'IA
En Go, il n’est pas possible de déterminer directement quelle goroutine a fermé un canal, car les canaux ne contiennent pas d’informations sur celui qui les ferme. Cependant, une convention courante est la suivante :
- La goroutine qui écrit dans le canal est responsable de sa fermeture.
- Les goroutines qui lisent reçoivent un signal de fermeture via le deuxième paramètre lors de la lecture :
value, ok := <-ch. Siok == false, le canal est fermé.
Pour savoir quelle goroutine a fermé le canal, on peut utiliser des mécanismes supplémentaires, comme transmettre des messages structurés avec des identifiants via le canal, ou utiliser des canaux de signal séparés ou des contextes (context.Context) pour la coordination.
Exemple :
ch := make(chan int)
// Goroutine qui écrit et ferme le canal
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine qui lit
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Canal fermé")
}()
Dans cet exemple, c’est la première goroutine qui ferme le canal. Pour savoir explicitement qui a fermé le canal, on peut ajouter des logs ou utiliser des canaux supplémentaires pour les signaux.