Sortir d'une instruction Select lorsque tous les canaux sont fermés
Dans Go, l'utilisation d'une instruction select est un moyen efficace de gérer plusieurs canaux simultanément. Cependant, lorsque vous travaillez avec des canaux qui finissent par se fermer, il devient nécessaire de trouver un moyen concis de boucler jusqu'à ce que tous les canaux soient fermés.
Considérons l'exemple suivant dans lequel deux goroutines produisent des données indépendamment et les envoient aux canaux. La goroutine principale consomme ces données sans égard à l'ordre.
for { select { case p, ok := <-mins: if ok { fmt.Println("Min:", p) } case p, ok := <-maxs: if ok { fmt.Println("Max:", p) } } }
Bien que cette instruction select permette de consommer chaque sortie au fur et à mesure de son arrivée, il n'y a aucun moyen de sortir explicitement de la boucle lorsque les deux canaux sont fermés.
La solution proposée, qui consiste à suivre l'état de chaque canal à l'aide d'indicateurs booléens, peut devenir lourde pour un grand nombre de canaux.
Une solution plus élégante consiste à attribuer zéro à un canal lorsque il a fermé. Cela garantit que le canal nul n'est jamais sélectionné pour la communication.
for { select { case x, ok := <-ch: fmt.Println("ch1", x, ok) if !ok { ch = nil } case x, ok := <-ch2: fmt.Println("ch2", x, ok) if !ok { ch2 = nil } } if ch == nil && ch2 == nil { break } }
En utilisant des canaux nuls, l'instruction select ignorera automatiquement les canaux qui ont été fermés. Lorsque tous les canaux seront fermés, la boucle sera rompue. Cette solution fournit un moyen propre et efficace de gérer la fermeture des canaux dans une instruction select, quel que soit le nombre de canaux impliqués.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!