Heim  >  Artikel  >  Backend-Entwicklung  >  So definieren Sie Typeinschränkungen für jeden Kanaltyp

So definieren Sie Typeinschränkungen für jeden Kanaltyp

WBOY
WBOYnach vorne
2024-02-13 09:40:09830Durchsuche

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 
}

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
}

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen