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

Comment définir des contraintes de type pour n'importe quel type de canal

WBOY
Libérer: 2024-02-13 09:40:09
avant
851 Les gens l'ont consulté

Comment définir des contraintes de type pour nimporte quel type de canal

Les contraintes de type en PHP sont une fonctionnalité puissante qui nous permet de définir les types de paramètres acceptés dans les paramètres d'une fonction ou d'une méthode. Non seulement limité aux types de données de base, PHP nous permet également de définir des contraintes de type pour les classes personnalisées, les interfaces, les tableaux et les objets itérables. Dans cet article, nous allons vous présenter comment définir des contraintes de type pour tout type de canal afin de mieux contrôler et protéger notre code. Que vous soyez débutant ou développeur expérimenté, ces conseils vous aideront à rendre votre code plus lisible et maintenable.

Contenu de la question

J'essaie de définir une fonction qui renvoie le pourcentage d'utilisation d'un canal donné :

func ChannelUsagePct[T any](channel chan T) int {
    channelCap := cap(channel)
    channelLen := len(channel)
    if channelCap == 0 {
        // Unbuffered channel
        return 0
    }
    return 100 * channelLen / channelCap
}

func main() {
    twoWayChannel := make(chan int, 10)
    var sendOnlyChannel chan<- int = twoWayChannel
    var recvOnlyChannel <-chan int = twoWayChannel

    fmt.Println(ChannelUsagePct(twoWayChannel))
    fmt.Println(ChannelUsagePct(sendOnlyChannel)) // Does not work 
    fmt.Println(ChannelUsagePct(recvOnlyChannel))  // Does not work 
}
Copier après la connexion

Maintenant, le problème est que sans changer la signature func, cela fonctionne pour le premier canal mais pas pour le deuxième et le troisième. Mais si je change la signature, je dois choisir le canal pour recevoir uniquement ou envoyer uniquement. Existe-t-il un moyen de définir un canal à chemin nul ? Par exemple. Je ne sais ni lire ni écrire, je veux juste utiliser la fonction caplen dessus. Idéalement, channelusagepct devrait fonctionner dans l’une de ces 3 situations.

Solution de contournement

Pour autoriser les trois formes possibles de canaux, des contraintes de type distinctes doivent être définies.

type chan[t any] interface {
    chan t | <-chan t | chan<- t
}
Copier après la connexion

Cela nécessite d'instancier la contrainte de type avec t lors de son utilisation, ce qui peut être fait en utilisant un autre paramètre de type :

func cap[t any, c chan[t]](c c) int {
    return cap(c)
}
Copier après la connexion

En raison de l'instanciation, le type entier ne peut pas être déduit, mais seul le type d'élément de canal doit être fourni :

ch := make(chan int, 3)
i := Cap[int](ch)
fmt.Println(i)
// 3
Copier après la connexion

https://www.php.cn/link/ca279b8542ab30bd43469423ce703e66

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!

Étiquettes associées:
source:stackoverflow.com
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!