Generischer Go-Container mit verschiedenen Laufzeittypen
In Go erhöht die Möglichkeit, generische Container zu erstellen, die Daten jeglicher Art verarbeiten können, die Codeflexibilität . Die Angabe des Kanaltyps während der Goroutine-Initiierung kann jedoch eine Herausforderung sein, da der Kanal potenziell jede Art von Daten enthalten kann.
Erster Ansatz:
Zunächst ein Versuch wurde erstellt, um die neu eingeführten Generika von Go 1.18 mit dem folgenden Code zu nutzen:
func StartController[T any](sender chan Packet[T]) { go runThread(sender) } func runThread[T any](sender chan Packet[T]) { fmt.Println("in thread") for true { data := <-sender fmt.Println(data) } }
Dieser Ansatz führte jedoch zu ein Kompilierungsfehler aufgrund des Fehlers beim Instanziieren des generischen Typs Packet[T interface{}].
Korrekte Verwendung von Generics:
Die Voraussetzung für die Verwendung von Generics ist Folgendes Ein parametrisierter Typ muss vor der Verwendung mit einem konkreten Typparameter instanziiert werden. Beispielsweise erfordert der generische Typ GenericChan[T any] chan T eine explizite Instanziierung mit einem konkreten Typ:
c := make(GenericChan[int])
Alternative Lösung:
Anstatt Generika zu verwenden, Eine alternative Lösung besteht darin, den Typ interface{} zu verwenden, der jeden Typ darstellen kann:
c := make(chan interface{}) func StartController(sender chan interface{}) { go runThread(sender) } func runThread(sender chan interface{}) { fmt.Println("in thread") for true { data := <-sender fmt.Println(data) } }
Dieser Ansatz ermöglicht es dem Kanal, Daten jeglicher Art empfangen. Während der Datenverarbeitung wären jedoch Typzusicherungen erforderlich, um den tatsächlichen Typ zu bestimmen.
Nachteile der Verwendung von interface{}:
Während die Verwendung von interface{} Flexibilität bietet, bietet es bringt auch potenzielle Nachteile mit sich:
Fazit:
Obwohl Generika Vorteile bieten, ist es wichtig, ihre korrekte Verwendung und ihre Einschränkungen zu verstehen. Im Falle eines Kanals, der jeden Typ verarbeiten kann, bleibt die Verwendung von interface{} eine praktikable Lösung, wenn auch mit einigen Kompromissen in Bezug auf Typsicherheit und Codekomplexität.
Das obige ist der detaillierte Inhalt vonWie kann ich einen generischen Go-Container für verschiedene Laufzeittypen ohne Kompilierungsfehler erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!