Maison >développement back-end >Golang >Comment puis-je vérifier efficacement si un canal Go Buffered est plein ?

Comment puis-je vérifier efficacement si un canal Go Buffered est plein ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-14 11:14:10471parcourir

How Can I Efficiently Check if a Go Buffered Channel is Full?

Comment vérifier si un canal tamponné est plein

Dans Go, les canaux tamponnés ont une capacité limitée pour stocker des données. Lorsque le canal est plein, l’envoi de données bloquera l’expéditeur. Cependant, si vous souhaitez supprimer des données au lieu de les bloquer, comment pouvez-vous déterminer si le canal est plein ?

Solution utilisant l'instruction Select

Une façon de vérifier si un Le canal tampon est plein consiste à utiliser l'instruction select avec un cas par défaut. Si aucun des cas ne peut être exécuté, comme l'envoi de données à un canal complet, le cas par défaut sera exécuté.

package main

import "fmt"

func main() {
    ch := make(chan int, 1)

    // Fill it up
    ch <- 1

    select {
    case ch <- 2: // Put 2 in the channel unless it is full
    default:
        fmt.Println("Channel full. Discarding value")
    }
}

Sortie :

Channel full. Discarding value

Ce code crée un canal tamponné de taille 1 et envoie une valeur pour le remplir. L'instruction select tente ensuite d'envoyer une autre valeur au canal. Si le canal est plein, le cas par défaut est exécuté, en imprimant un message et en supprimant la valeur.

Vérifier sans envoi

Alternativement, vous pouvez vérifier le nombre d'éléments mis en file d'attente dans un canal en utilisant len(ch). Cela vous permet de déterminer si un canal est plein sans tenter d'envoyer des données.

if len(ch) == cap(ch) {
    // Channel was full, but might not be by now
} else {
    // Channel wasn't full, but might be by now
}

Cependant, notez que le résultat de la comparaison peut devenir invalide au moment où vous entrez le bloc if en raison d'un flux de données simultané. .

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