Maison  >  Article  >  développement back-end  >  Golang détermine que chan est fermé

Golang détermine que chan est fermé

WBOY
WBOYoriginal
2023-05-10 15:55:072147parcourir

Lors de l'apprentissage et de l'utilisation de Golang, nous rencontrons souvent des situations où nous devons utiliser chan pour implémenter la simultanéité des coroutines. Cependant, en utilisation réelle, nous devons parfois déterminer si un chan a été fermé. Cet article présente plusieurs méthodes Golang pour déterminer si un chan est fermé.

Tout d’abord, il est très important de comprendre l’utilisation de base et les caractéristiques du chan en golang. Chan in golang est un mécanisme de contrôle de concurrence basé sur le modèle CSP, qui peut réaliser la communication et la synchronisation entre les coroutines. La méthode de communication de Chan se bloque. Lorsque l'opération de lecture ou d'écriture ne peut pas être terminée, la coroutine sera bloquée jusqu'à ce que les données puissent être lues ou que l'espace libre puisse être écrit. Une caractéristique de chan est que lorsque chan a été fermé, les opérations de lecture et d'écriture provoqueront à nouveau la panique. Par conséquent, comment déterminer si chan a été fermé devient très important.

Voici plusieurs façons de déterminer si le chan est fermé dans Golang :

Méthode 1 : ajouter un signal

Nous pouvons déterminer si le chan est fermé en ajoutant un signal à la variable chan. Lorsque le chan est fermé, nous pouvons dire aux autres coroutines que le chan a été fermé en fermant le signal.

L'exemple de code est le suivant :

package main

import "fmt"

func main() {
    a := make(chan int)
    quit := make(chan bool)

    go func() {
        for {
            select {
            case x := <-a:
                fmt.Println(x)
            case <-quit:
                fmt.Println("chan closed")
                return
            }
        }
    }()

    for i := 0; i < 5; i++ {
        a <- i
    }
    close(a)
    quit <- true

    fmt.Println("done")
}

Dans le code ci-dessus, nous créons un chan de type int nommé a et un chan de type bool nommé quit. Dans la coroutine, l'opération de lecture de a et l'opération de fermeture du signal de quit sont surveillées via select. Lorsque chan est fermé, la coroutine est informée via le signal de quit. Dans la coroutine principale, nous saisissons 5 données dans a, puis fermons a via la fonction close() et notifions la fin de la coroutine via le signal de sortie. Enfin, done est imprimé pour indiquer que l'exécution du programme est terminée.

Méthode 2 : Utilisez la fonction range

Nous pouvons également utiliser la fonction range pour déterminer si le chan a été fermé. Lorsque le canal est fermé, la fonction de plage prend fin. Voici l'exemple de code :

package main

import "fmt"

func main() {
    a := make(chan int)

    go func() {
        for x := range a {
            fmt.Println(x)
        }
        fmt.Println("chan closed")
    }()

    for i := 0; i < 5; i++ {
        a <- i
    }
    close(a)

    fmt.Println("done")
}

Dans le code ci-dessus, nous créons d'abord un chan de type int nommé a. Dans la coroutine, les données de chan sont parcourues via la fonction range. Lorsque chan est fermé, la fonction range mettra fin à la coroutine et imprimera "chan fermé" pour indiquer que chan a été fermé. Dans la coroutine principale, nous saisissons 5 données dans a, puis fermons a via la fonction close(). Enfin, done est imprimé pour indiquer que l'exécution du programme est terminée.

Méthode 3 : utilisez la variable ok

Une autre façon de déterminer si chan a été fermé est d'utiliser la variable ok. Lorsque le canal est fermé, la variable ok deviendra fausse.

L'exemple de code est le suivant :

package main

import "fmt"

func main() {
    a := make(chan int)

    go func() {
        for {
            x, ok := <-a
            if !ok {
                fmt.Println("chan closed")
                break
            }
            fmt.Println(x)
        }
    }()

    for i := 0; i < 5; i++ {
        a <- i
    }
    close(a)

    fmt.Println("done")
}

Dans le code ci-dessus, nous créons un chan de type int nommé a. Dans la coroutine, nous parcourons les données dans chan à travers une boucle for. Si la variable ok devient fausse, cela signifie que chan a été fermé et que la boucle se termine, puis sort de la boucle. Dans la coroutine principale, nous saisissons 5 données dans a, puis fermons a via la fonction close(). Enfin, done est imprimé pour indiquer que l'exécution du programme est terminée.

Les trois méthodes ci-dessus peuvent toutes déterminer si chan in golang est fermé. Vous pouvez choisir la méthode appropriée en fonction de vos besoins personnels. Déterminer si chan est fermé est un point de connaissance important utilisé dans le golang. J'espère que cela sera utile à l'apprentissage de chacun.

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!

Déclaration:
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