Heim >Backend-Entwicklung >Golang >Ist meine eingebettete Schnittstellenmethode „echt'? Erkennen implementierter Methoden über Go Reflection
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!