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?

Warum meldet Go einen Fehler, wenn eine Funktion mit einem bestimmten Parametertyp an eine Funktion übergeben wird, die einen Interface{}-Parameter akzeptiert?

DDD
DDDOriginal
2024-12-25 13:03:10429Durchsuche

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

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!

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