Heim >Backend-Entwicklung >Golang >Warum meldet Go einen Fehler, wenn eine Funktion mit einem bestimmten Parametertyp an eine Funktion übergeben wird, die einen Interface{}-Parameter akzeptiert?
Typfunktion mit Schnittstellenparameter-Inkompatibilität
Beim Definieren eines Funktionstyps, der jeden Wert akzeptiert, der einer Schnittstelle entspricht, kann es verwirrend sein, darauf zu stoßen ein Fehler beim Aufrufen einer Funktion, die dieser Spezifikation zu entsprechen scheint.
Bedenken Sie Folgendes Beispiel:
type myfunc func(x interface{}) func a(num int) { return } func b(f myfunc) { f(2) return } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b return }
Der Fehler tritt auf, weil Schnittstellen in Go Invarianz aufweisen, was bedeutet, dass zwar ein int an eine Funktion übergeben werden kann, die eine Schnittstelle{} erwartet, dies jedoch nicht für gilt func(int) und func(interface{}).
In Go müssen Funktionen mit kompatiblen Typen identische Parameter- und Rückgabetypen haben. Da func(int) und func(interface{}) diese Anforderung nicht erfüllen, werden sie von Go als inkompatibel angesehen.
Um dieses Problem zu beheben, sollten Sie den folgenden Ansatz in Betracht ziehen:
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(add2) }
In diesem Beispiel wird func(int)int an eine Funktion übergeben, die interface{} erwartet. Dies ist zulässig, da func(int)int die Schnittstelle{} implementiert, die eine einzelne Methode mit angegebenen Eingabe- und Rückgabetypen erfordert.
Eine ausführlichere Erklärung der Varianz in Go finden Sie im Wikipedia-Artikel zu den Betreff und den Blog-Beitrag, der in der bereitgestellten Antwort verlinkt ist.
Das obige ist der detaillierte Inhalt vonWarum meldet Go einen Fehler, wenn eine Funktion mit einem bestimmten Parametertyp an eine Funktion übergeben wird, die einen Interface{}-Parameter akzeptiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!