Maison >développement back-end >Golang >Quelle est la différence cruciale entre « make(chan bool) » et « make(chan bool, 1) » dans les canaux Go ?

Quelle est la différence cruciale entre « make(chan bool) » et « make(chan bool, 1) » dans les canaux Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 20:58:301052parcourir

What's the Crucial Difference Between `make(chan bool)` and `make(chan bool, 1)` in Go Channels?

Dévoilement des différences dans le comportement des chaînes : make(chan bool) vs make(chan bool, 1)

Les chaînes font partie intégrante du modèle de concurrence de Go, permettant une communication et une synchronisation efficaces entre les goroutines. Cependant, en fonction de la taille du tampon spécifiée lors de la création du canal, leur comportement peut varier considérablement.

Canaux sans tampon (make(chan bool))

Canaux sans tampon, créés avec make(chan bool), ont une taille de tampon de 0. Cela signifie qu'ils ne peuvent contenir aucune valeur à un moment donné. Par conséquent, toute tentative de lecture ou d'écriture sur un canal sans tampon sera bloquée jusqu'à ce qu'un autre goroutine soit disponible pour terminer la communication.

Canaux tamponnés (make(chan bool, 1))

Les canaux tamponnés, créés avec make(chan bool, 1), ont une taille de tampon non nulle. Ce tampon permet aux goroutines d'envoyer ou de recevoir des valeurs sans avoir à attendre qu'une autre goroutine soit disponible. Le tampon agit comme un stockage temporaire des valeurs, permettant une communication asynchrone.

Exemple pratique

Considérez le code suivant :

<code class="go">chanFoo := make(chan bool)

for i := 0; i < 5; i++ {
    select {
    case <-chanFoo:
        fmt.Println("Read")
    case chanFoo <- true:
        fmt.Println("Write")
    default:
        fmt.Println("Neither")
    }
}</code>

Dans ce Par exemple, chanFoo est un canal sans tampon. Lorsque le programme s'exécute, la goroutine tente continuellement de lire ou d'écrire sur le canal, mais elle reste bloquée car il n'y a pas de goroutine avec laquelle communiquer. En conséquence, le programme imprime « Ni l'un ni l'autre » pour chaque itération.

Canal tamponné en action

Maintenant, considérons ce code révisé :

<code class="go">chanFoo := make(chan bool, 1)

for i := 0; i < 5; i++ {
    select {
    case <-chanFoo:
        fmt.Println("Read")
    case chanFoo <- true:
        fmt.Println("Write")
    default:
        fmt.Println("Neither")
    }
}</code>

En ajoutant une taille de tampon de 1 à chanFoo, nous permettons la communication asynchrone. Le programme imprime désormais des messages « Lire » et « Écrire » en alternance, démontrant la capacité du tampon à stocker des valeurs jusqu'à ce qu'un autre goroutine soit prêt à lire ou à écrire.

Conclusion

Comprendre la différence entre les canaux sans tampon et avec tampon est crucial pour une programmation simultanée efficace dans Go. Les canaux sans tampon assurent la synchronisation, tandis que les canaux avec tampon permettent une communication asynchrone. Une sélection minutieuse de la taille du tampon permet des performances optimales et évite les blocages ou blocages potentiels.

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