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 ?

DDD
Libérer: 2024-11-12 19:42:02
original
457 Les gens l'ont consulté

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

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)
        }
    }
}
Copier après la connexion

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
    }
}
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal