So definieren Sie Typeinschränkungen für jeden Kanaltyp

WBOY
Freigeben: 2024-02-13 09:40:09
nach vorne
851 Leute haben es durchsucht

So definieren Sie Typeinschränkungen für jeden Kanaltyp

Typbeschränkungen in PHP sind eine leistungsstarke Funktion, die es uns ermöglicht, die akzeptierten Parametertypen in den Parametern einer Funktion oder Methode zu definieren. PHP beschränkt sich nicht nur auf grundlegende Datentypen, sondern ermöglicht uns auch die Definition von Typeinschränkungen für benutzerdefinierte Klassen, Schnittstellen, Arrays und iterierbare Objekte. In diesem Artikel stellen wir Ihnen vor, wie Sie Typeinschränkungen für jeden Kanaltyp definieren, um unseren Code besser zu kontrollieren und zu schützen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, helfen Ihnen diese Tipps dabei, Ihren Code lesbarer und wartbarer zu machen.

Frageninhalt

Ich versuche eine Funktion zu definieren, die den Nutzungsprozentsatz eines bestimmten Kanals zurückgibt:

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 
}
Nach dem Login kopieren

Das Problem ist nun, dass dies ohne Änderung der Funktionssignatur für den ersten Kanal funktioniert, nicht jedoch für den zweiten und dritten. Wenn ich jedoch die Signatur ändere, muss ich den Kanal auswählen, um nur zu empfangen oder nur zu senden. Gibt es eine Möglichkeit, einen Nullpfadkanal zu definieren? Zum Beispiel. Ich kann weder lesen noch schreiben, ich möchte nur die caplen-Funktion darauf verwenden. Im Idealfall sollte channelusagepct in jeder dieser drei Situationen funktionieren.

Workaround

Um alle drei möglichen Formen von Kanälen zu ermöglichen, müssen separate Typbeschränkungen definiert werden.

type chan[t any] interface {
    chan t | <-chan t | chan<- t
}
Nach dem Login kopieren

Dies erfordert die Instanziierung der Typbeschränkung mit t bei der Verwendung, was mit einem anderen Typparameter erfolgen kann:

func cap[t any, c chan[t]](c c) int {
    return cap(c)
}
Nach dem Login kopieren

Aufgrund der Instanziierung kann nicht auf den gesamten Typ geschlossen werden, sondern es muss nur der Typ des Kanalelements bereitgestellt werden:

ch := make(chan int, 3)
i := Cap[int](ch)
fmt.Println(i)
// 3
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonSo definieren Sie Typeinschränkungen für jeden Kanaltyp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!