Heim > Backend-Entwicklung > Golang > Kann Kontravarianz das Kompatibilitätsproblem mit generischen Typen in der Pipe-Funktion von Go 1.18 lösen?

Kann Kontravarianz das Kompatibilitätsproblem mit generischen Typen in der Pipe-Funktion von Go 1.18 lösen?

Linda Hamilton
Freigeben: 2024-11-24 07:47:11
Original
402 Leute haben es durchsucht

Can Contravariance Solve Go 1.18's Generic Type Compatibility Issue in the Pipe Function?

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

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage