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:
Antworten:
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!