Heim >Backend-Entwicklung >Golang >Warum kann die Funktion „Pipe' in Go 1.18 Generics nicht mit kompatiblen Typen kompiliert werden?

Warum kann die Funktion „Pipe' in Go 1.18 Generics nicht mit kompatiblen Typen kompiliert werden?

DDD
DDDOriginal
2024-11-17 10:30:04506Durchsuche

Why Does the `Pipe` Function Fail to Compile with Compatible Types in Go 1.18 Generics?

Kontravariantes Typverhalten in Go 1.18 Generics

Go 1.18 führte Generics ein, die die Erstellung von typsicherem Code ermöglichen. Bestimmte Verhaltensweisen können jedoch von den Erwartungen abweichen, beispielsweise bei kontravarianten Typen.

Bedenken Sie die folgende Funktion in Go 1.18:

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 dient dazu, die Ausgabe von left als weiterzuleiten Eingang nach rechts. Allerdings schlägt die Kompilierung fehl, wenn es wie folgt verwendet wird:

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

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

var OpenRead = Pipe(OpenFile, ReadAll)

Dies liegt daran, dass der Compiler feststellt, dass T1 *os.File ist, das nicht mit io.Reader identisch ist, obwohl es kompatibel ist.

Das gewünschte Verhalten wäre die Möglichkeit, die Pipe-Funktion mit Funktionen zu verketten, die einen kompatiblen Typ als Eingabe akzeptieren. Dies stimmt mit dem erwarteten Verhalten überein, wenn die Kette ohne Generika aufgerufen wird.

Fragen:

  1. Gibt es eine Möglichkeit, die Signatur von Pipe anzupassen, um dies zu berücksichtigen gewünschtes Verhalten?
  2. Ist dieses Verhalten beabsichtigt oder a Fehler?

Antworten:

  1. Nein, es gibt derzeit keine Möglichkeit, die Kompatibilität zwischen Typen mithilfe von Generika in Go 1.18 auszudrücken.
  2. Dieses Verhalten ist kein Fehler. Dies spiegelt den Mangel an Unterstützung für kovariante Ergebnistypen in Go wider.

Problemumgehung:

Es ist zwar nicht möglich, „typsicher zur Kompilierungszeit“ zu erreichen "-Verhalten besteht eine mögliche Problemumgehung darin, die Typzusicherung zu verwenden:

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

Dieser Code ist zur Kompilierungszeit nicht typsicher, kann es aber sein stellen in manchen Fällen die gewünschte Funktionalität bereit.

Das obige ist der detaillierte Inhalt vonWarum kann die Funktion „Pipe' in Go 1.18 Generics nicht mit kompatiblen Typen kompiliert werden?. 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