Heim >Backend-Entwicklung >Golang >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.
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 cap
和 len
-Funktion darauf verwenden.
Im Idealfall sollte channelusagepct
in jeder dieser drei Situationen funktionieren.
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!