Middle+
Que se passe-t-il si le lecteur ferme le canal alors que l'écrivain écrit encore ? Comment éviter la panique ?
sobes.tech IA
Réponse de l'IA
Si le lecteur ferme le canal et que l’écrivain continue à écrire dedans, une panique (panic) se produira en Go avec le message "send on closed channel".
Pour éviter cette panique, on peut:
- Utiliser un drapeau ou un canal supplémentaire pour signaler la fermeture, afin que l’écrivain sache que le canal est fermé et cesse d’écrire.
- Fermer le canal uniquement après que tous les écrivains ont terminé, par exemple en utilisant
sync.WaitGroup. - Utiliser recover pour gérer la panique, mais ce n’est pas recommandé comme méthode principale.
Exemple de fermeture sécurisée d’un canal:
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
}()
// Fermer le canal après que l’écrivain a terminé
ngo func() {
wg.Wait()
close(ch)
}()
for val := range ch {
fmt.Println(val)
}
Ainsi, le canal est fermé uniquement après que toutes les écritures sont terminées, et le lecteur peut lire en toute sécurité jusqu’à la fermeture.