Heim > Backend-Entwicklung > Golang > Warum erlaubt Go die Übergabe von „func(int)' an „func(interface{})' nicht, obwohl „int' „interface{}' erfüllt?

Warum erlaubt Go die Übergabe von „func(int)' an „func(interface{})' nicht, obwohl „int' „interface{}' erfüllt?

Barbara Streisand
Freigeben: 2024-12-29 18:41:11
Original
633 Leute haben es durchsucht

Why Doesn't Go Allow Passing `func(int)` to `func(interface{})` Despite `int` Satisfying `interface{}`?

Typfunktion mit Schnittstellenparameter-Inkompatibilitätsfehler

In Go erscheint die Deklaration einer Typfunktion so, dass sie jeden Wert akzeptiert, der der Schnittstelle{} entspricht, unkompliziert. Der Aufruf einer als Argument übergebenen Funktion, die dieser Typspezifikation entspricht, löst jedoch einen Fehler aus.

Dieser Fehler ist auf das Konzept der Typvarianz zurückzuführen, insbesondere auf das Fehlen von Kovarianz in den Schnittstellen von Go. Während eine Ganzzahl (int) an eine Funktion übergeben werden kann, die interface{} erwartet, gilt das gleiche Prinzip nicht für Funktionen.

Insbesondere sind func(int) und func(interface{}) keine kompatiblen Typen . Obwohl int mit interface{} übereinstimmt, entspricht func(int) nicht func(interface{}). Dies liegt daran, dass Schnittstellen in Go invariant sind.

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

package main

import "fmt"

type myfunc interface{}

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

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

func main() {
    foo(add2)
}
Nach dem Login kopieren

In diesem Beispiel implementiert func(int)int interface{} und vermeidet so den Typinkompatibilitätsfehler.

Das obige ist der detaillierte Inhalt vonWarum erlaubt Go die Übergabe von „func(int)' an „func(interface{})' nicht, obwohl „int' „interface{}' erfüllt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage