Fehler beim Typ func mit inkompatiblem Schnittstellenparameter
Problem:
Beim Aufrufen einer als Argument übergebenen Funktion Bei einer Typfunktion, die Werte annimmt, die der Schnittstelle{} entsprechen, ist ein Fehler aufgetreten. Zum Beispiel im folgenden Code:
type myfunc func(x interface{}) func a(num int) { } func b(f myfunc) { f(2) } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b }
Erklärung:
Dieser Fehler ist darauf zurückzuführen, dass Go in seinem Typsystem Varianz nicht unterstützt. Varianz bezieht sich auf die Flexibilität bei der Verwendung von Subtypen und Supertypen in Parameterargumenten. Die Schnittstellen von Go unterstützen im Gegensatz zu anderen Typsystemen keine Varianz.
Im gegebenen Beispiel kann zwar ein int an eine Funktion übergeben werden, die interface{} akzeptiert, dies bedeutet jedoch nicht, dass func(int) kompatibel ist mit func(interface{}). Dies liegt daran, dass Schnittstellen in Go nicht kovariant sind.
Lösung:
Um dieses Problem zu umgehen, können Funktionen an Funktionen übergeben werden, die interface{} erwarten, indem interface{} über eine anonyme Funktion implementiert wird :
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(func(n int) int { return n + 2 }) }
Dieser Ansatz nutzt die Tatsache, dass func(int)int implementiert interface{}.
Weitere Einblicke in die Varianz in Programmiersprachen finden Sie im Wikipedia-Artikel und im unten verlinkten Beitrag:
Das obige ist der detaillierte Inhalt vonWarum erzeugt das Typsystem von Go einen „Inkompatiblen Fehler', wenn Funktionen mit Schnittstellenparametern übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!