Heim > Backend-Entwicklung > Golang > Warum erzeugt das Typsystem von Go einen „Inkompatiblen Fehler', wenn Funktionen mit Schnittstellenparametern übergeben werden?

Warum erzeugt das Typsystem von Go einen „Inkompatiblen Fehler', wenn Funktionen mit Schnittstellenparametern übergeben werden?

Linda Hamilton
Freigeben: 2025-01-01 12:21:10
Original
494 Leute haben es durchsucht

Why Does Go's Type System Produce

Fehler beim Typ func mit inkompatiblem Schnittstellenparameter

Problem:
Beim Aufrufen einer als Argument übergebenen Funktion Bei einer Typfunktion, die Werte annimmt, die der Schnittstelle{} entsprechen, ist ein Fehler aufgetreten. Zum Beispiel im folgenden Code:

type myfunc func(x interface{})

func a(num int) {
}

func b(f myfunc) {
    f(2)
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
}
Nach dem Login kopieren

Erklärung:
Dieser Fehler ist darauf zurückzuführen, dass Go in seinem Typsystem Varianz nicht unterstützt. Varianz bezieht sich auf die Flexibilität bei der Verwendung von Subtypen und Supertypen in Parameterargumenten. Die Schnittstellen von Go unterstützen im Gegensatz zu anderen Typsystemen keine Varianz.

Im gegebenen Beispiel kann zwar ein int an eine Funktion übergeben werden, die interface{} akzeptiert, dies bedeutet jedoch nicht, dass func(int) kompatibel ist mit func(interface{}). Dies liegt daran, dass Schnittstellen in Go nicht kovariant sind.

Lösung:
Um dieses Problem zu umgehen, können Funktionen an Funktionen übergeben werden, die interface{} erwarten, indem interface{} über eine anonyme Funktion implementiert wird :

package main

import "fmt"

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

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

func main() {
    foo(func(n int) int {
        return n + 2
    })
}
Nach dem Login kopieren

Dieser Ansatz nutzt die Tatsache, dass func(int)int implementiert interface{}.

Weitere Einblicke in die Varianz in Programmiersprachen finden Sie im Wikipedia-Artikel und im unten verlinkten Beitrag:

  • [Varianz (Informatik)](https:/ /en.wikipedia.org/wiki/Variance_(computer_science))
  • [Variance in Generic Programmierung](https://www.fluentcpp.com/2018/11/29/variance-in-generic-programming/)

Das obige ist der detaillierte Inhalt vonWarum erzeugt das Typsystem von Go einen „Inkompatiblen Fehler', wenn Funktionen mit Schnittstellenparametern übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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