Maison > développement back-end > Golang > le corps du texte

Comment sortir d'une instruction Select lorsque tous les canaux sont fermés en Go ?

Linda Hamilton
Libérer: 2024-11-13 16:47:02
original
197 Les gens l'ont consulté

How to Break Out of a Select Statement When All Channels Are Closed in Go?

Supprimer une instruction Select lorsque tous les canaux sont fermés

Considérez un scénario dans lequel plusieurs goroutines envoient des données à des canaux individuels et vous souhaitez consommer ces données dans un ordre arbitraire. L’utilisation d’une instruction select offre un moyen pratique de gérer les entrées simultanées provenant de plusieurs sources. Cependant, le défi se pose lorsque vous devez quitter la boucle uniquement lorsque tous les canaux sont fermés.

Solution naïve

Une approche intuitive peut impliquer de vérifier la disponibilité de chaque canal en utilisant le drapeau ok. Cependant, cette solution est sujette aux erreurs car un canal fermé redevient disponible s'il est sélectionné. Cela conduit à une boucle infinie, comme le démontre cet exemple de terrain de jeu : http://play.golang.org/p/rOjdvnji49.

Solution améliorée

Une solution plus Une approche efficace consiste à utiliser le fait qu’un canal nul n’est jamais prêt pour la communication. Chaque fois qu'un canal se ferme, il peut être défini sur zéro, garantissant ainsi son exclusion des futures instructions de sélection. Cela garantit que la boucle ne se termine que lorsque tous les canaux sont fermés :

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 &amp;&amp; ch2 == nil {
        break
    }
}
Copier après la connexion

Exemple de Playground : http://play.golang.org/p/8lkV_Hffyj

Considérations pratiques

En pratique, il est peu probable que vous ayez besoin de gérer un grand nombre de chaînes dans une seule instruction select. Si un tel scénario se présente, il est conseillé d'utiliser une solution plus spécialisée, comme un multiplexeur de canaux, pour éviter d'encombrer le code avec des contrôles nuls excessifs.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal