Heim >Backend-Entwicklung >Golang >Warum kann ich in Go kein „func(int)' an eine Funktion übergeben, die „func(interface{})' erwartet?

Warum kann ich in Go kein „func(int)' an eine Funktion übergeben, die „func(interface{})' erwartet?

Susan Sarandon
Susan SarandonOriginal
2024-12-23 16:09:12529Durchsuche

Why Can't I Pass a `func(int)` to a Function Expecting `func(interface{})` in Go?

Typ func mit Schnittstellenparameter inkompatibel: Varianz verstehen

In Go stoße ich auf die Meldung „a (type func(int)) kann nicht verwendet werden als Der Fehler „type myfunc in argument to b“ beim Aufrufen einer Funktion mit einem Schnittstellenparameter kann verwirrend sein. Dieses Problem entsteht aufgrund des Varianzkonzepts in Typsystemen.

Gos Schnittstellen weisen keine Varianz auf, was bedeutet, dass sich eine Schnittstelle nicht kovariant verhält wie in einigen anderen Programmiersprachen. Wenn ein Typ }), obwohl int einer Schnittstelle {} zuweisbar ist. Diese Inkompatibilität ergibt sich aus der Tatsache, dass sich Schnittstellen in Go nicht kovariant verhalten.

Um dieses Problem zu beheben, können Sie func(int) an eine Funktion übergeben, die interface{} erwartet, wie im folgenden Beispiel gezeigt:

Dies funktioniert, weil func(int)int interface{} implementiert und den Typ effektiv zu einer allgemeineren Schnittstelle „erweitert“. Typ.
package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

Weitere Erläuterungen finden Sie im bereitgestellten Wikipedia-Artikel über Varianz und im verlinkten Blog-Beitrag, der die Varianz in verschiedenen Programmiersprachen untersucht, insbesondere solchen, die Vererbung unterstützen.

Das obige ist der detaillierte Inhalt vonWarum kann ich in Go kein „func(int)' an eine Funktion übergeben, die „func(interface{})' erwartet?. 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