Heim  >  Artikel  >  Backend-Entwicklung  >  Kann Go 1.18 Generics kontravariante Typen in Funktionssignaturen verarbeiten?

Kann Go 1.18 Generics kontravariante Typen in Funktionssignaturen verarbeiten?

Susan Sarandon
Susan SarandonOriginal
2024-11-17 10:50:021002Durchsuche

Can Go 1.18 Generics Handle Contravariant Types in Function Signatures?

Generika mit kontravarianten Typen in Go 1.18: Erläuterung und Einschränkungen

Bemühungen, eine Funktion mithilfe von Generika in Go 1.18 zu definieren, die zwei Funktionen mit übernimmt Kompatible, aber nicht identische Typen – ein kontravariantes Verhalten – sind auf Herausforderungen gestoßen. Schauen wir uns die Einzelheiten an, um zu verstehen, warum.

Betrachten Sie die folgende Funktionsdefinition:

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

Diese Funktion zielt darauf ab, die Ausgabe der linken Funktion in die rechte Funktion umzuleiten und Berechnungen zu verketten. Beim Versuch, es jedoch mit dem folgenden Beispiel zu verwenden:

func OpenFile(name string) *os.File {
...
}

func ReadAll(rdr io.Reader) []byte {
...
}

var OpenRead = Pipe(OpenFile, ReadAll)

schlägt die Kompilierung fehl. Dies liegt daran, dass der Compiler erwartet, dass T1 mit *os.File identisch ist, obwohl es mit io.Reader kompatibel ist. Obwohl es vernünftig erscheint, zu erwarten, dass kompatible Typen akzeptiert werden, ist dies nicht der Fall, da Go kovariante Ergebnistypen nicht unterstützt.

Gibt es eine Möglichkeit, diese Signatur in Go 1.18 zu beheben?

Leider nein. Den Generika von Go fehlt derzeit die Möglichkeit, die Typkonvertibilität mithilfe von Typparametern auszudrücken, sodass es unmöglich ist, die Pipe-Funktion zu ändern, um dieses Verhalten zu berücksichtigen.

Ist das ein Fehler in Go 1.18?

Nein. Wie in den offiziellen FAQ angegeben, ist dieses Verhalten beabsichtigt und wird nicht als Fehler angesehen.

Workaround

Um ein ähnliches Ergebnis zu erzielen, kann man einen Konvertierungsschritt manuell implementieren:

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

Es ist jedoch wichtig zu beachten, dass dieser Ansatz keine Typsicherheit zur Kompilierungszeit bietet.

Das obige ist der detaillierte Inhalt vonKann Go 1.18 Generics kontravariante Typen in Funktionssignaturen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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