Kontravariante Typen in Go 1.18 Generics
In Go 1.18 ermöglichen generische Typen die Definition von Funktionen mit Typen, die je nach Typargumenten variieren. Kontravarianz, eine bestimmte Art von Varianz, ermöglicht es Funktionen, einen größeren Bereich von Eingabetypen zu akzeptieren und gleichzeitig eine klar definierte Beziehung zwischen Eingabe- und Ausgabetypen aufrechtzuerhalten.
Pipe-Funktion
Die bereitgestellte Pipe-Funktion zielt darauf ab, Funktionen zu erstellen, die Werte transformieren. Es wird erwartet, dass der Ausgabetyp der linken Funktion mit dem Eingabetyp der rechten Funktion übereinstimmt. Im folgenden Beispiel schlägt die Kompilierung jedoch fehl:
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 { return func(a A) T2 { return right(left(a)) } } func OpenFile(name string) *os.File { ... } func ReadAll(rdr io.Reader) []byte { ... } var OpenRead = Pipe(OpenFile, ReadAll)
Der Compiler beschwert sich, weil T1 als *os.File betrachtet wird, obwohl es mit io.Reader kompatibel ist.
Gibt es eine Lösung?
Leider gibt es in den Generika von Go 1.18 keine Möglichkeit, Änderungen vorzunehmen die Signatur von Pipe, um das gewünschte Verhalten zu ermöglichen. Go unterstützt keine kovarianten Ergebnistypen, was bedeutet, dass der Ausgabetyp einer Funktion nicht basierend auf dem Eingabetyp variieren kann.
Ist es ein Fehler?
Das Verhalten in Go 1.18 ist kein Fehler. Dies ist beabsichtigt, wie in den FAQ für Go-Generika erläutert.
Problemumgehung
Um diese Einschränkung zu beheben, kann eine modifizierte Version der Pipe-Funktion verwendet werden es opfert die Typsicherheit zur Kompilierungszeit:
func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 { return func(a A) T3 { return right(any(left(a)).(T2)) } }
Das obige ist der detaillierte Inhalt vonKann Kontravarianz das Kompatibilitätsproblem mit generischen Typen in der Pipe-Funktion von Go 1.18 lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!