Maison >développement back-end >Golang >Comment définir des contraintes de type pour n'importe quel type de canal

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

WBOY
WBOYavant
2024-02-13 09:40:09886parcourir

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 
}

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
}

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)
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer