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
Barbara StreisandOriginal
2024-12-29 18:41:11622Durchsuche

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)
}

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!

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