Heim >Backend-Entwicklung >Golang >Ist meine eingebettete Schnittstellenmethode „echt'? Erkennen implementierter Methoden über Go Reflection

Ist meine eingebettete Schnittstellenmethode „echt'? Erkennen implementierter Methoden über Go Reflection

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-05 15:32:13806Durchsuche

Is My Embedded Interface Method

Go Reflection mit in Struktur eingebetteter Schnittstelle: Erkennen „echter“ Funktionen

Beim Einbinden einer eingebetteten Schnittstelle in eine Struktur (z. B. Typ B struct { A; bar string }), schlägt Go idiomatisch vor, dass B die Schnittstelle A implementieren muss. Das Reflection-Paket ruft jedoch Schnittstellenmethoden direkt von ab Bs Typ, was möglicherweise zu Verwirrung führt.

Um dies zu beheben, betrachten Sie das folgende Szenario:

type A interface {
     Foo() string
}

type B struct {
     A
     bar string
}

Angenommen, wir haben eine Instanz von B und möchten ihre Foo-Methode mithilfe von Reflektion erhalten:

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")

Wenn has wahr ist, dann stellt sich folgende Frage: Wie können wir erkennen, ob in der zurückgegebenen Datei eine „echte“ Implementierung von Foo vorhanden ist? bMeth?

Die bereitgestellte Antwort schlägt einen einfachen Ansatz vor:

method_in_table := B.Foo
fmt.Printf("%T \n", method_in_table)

Dies gibt den Funktionstyp aus:

func(main.B) string

Wenn b.A Null ist, wie es bei der Fall ist Standardmäßig gibt es keine „echte“ Implementierung von Foo in der eingebetteten Schnittstelle. Dies kann überprüft werden mit:

if b.A != nil { b.Foo() }

Darüber hinaus stellt die Reflection-API selbst Mechanismen zur Erkennung eines Null-Schnittstellenwerts bereit:

if bMeth.Ptr.IsNil() { // there is no "real" implementation of Foo
}

Das obige ist der detaillierte Inhalt vonIst meine eingebettete Schnittstellenmethode „echt'? Erkennen implementierter Methoden über Go Reflection. 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
Vorheriger Artikel:So scannen Sie in GoLangNächster Artikel:So scannen Sie in GoLang