Sobes.tech
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.