Heim >Backend-Entwicklung >Golang >Wie kann ich mithilfe von Reflection zuverlässig erkennen, ob eine eingebettete Schnittstelle in einer Go-Struktur über eine Funktionsimplementierung verfügt?
Go-Reflexion mit eingebetteter Schnittstelle in Struct
Erkennung „echter“ Funktionen
Go-Reflexion Das Paket bietet Zugriff auf Informationen zu Typen und Werten zur Laufzeit. Dies kann ein leistungsstarkes Werkzeug sein, aber auch verwirrend sein, wenn mit eingebetteten Schnittstellen in Strukturen gearbeitet wird.
Betrachten Sie das folgende Beispiel:
type A interface { Foo() string } type B struct { A bar string }
Wie Sie beobachtet haben, ist dies bei Go nicht der Fall Erzwingen Sie die Implementierung der eingebetteten Schnittstelle zur Kompilierungszeit. Dies bedeutet, dass es möglich ist, eine Schnittstelle in eine Struktur einzubetten, ohne eine Implementierung bereitzustellen.
Reflection verwenden, um auf Methoden zuzugreifen
Sie können das Reflection-Paket verwenden, um Methoden von a abzurufen Die eingebettete Schnittstelle von struct, auch wenn keine Implementierung bereitgestellt wird:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if has { fmt.Printf("HAS IT: %s\n", bMeth.Type.Kind()) res := bMeth.Func.Call([]reflect.Value{reflect.ValueOf(B{})}) val := res[0].Interface() fmt.Println(val) } else { fmt.Println("DOESNT HAS IT") }
Wenn die eingebettete Schnittstelle jedoch keine Implementierung hat, kann dieser Code dies tun Panik.
Erkennen des Fehlens einer Implementierung
Um festzustellen, ob eine eingebettete Schnittstelle keine Implementierung hat, können Sie den Zeiger auf die Funktion in der Funktionstabelle überprüfen anonymer Schnittstellenwert:
b := B{} bType := reflect.TypeOf(b) bMeth, has := bType.MethodByName("Foo") if has { bMethPtr := bMeth.Func.Pointer() if bMethPtr == 0 { fmt.Println("No implementation") } else { fmt.Println("Implementation found") } } else { fmt.Println("Interface not embedded") }
Wenn der Zeiger auf die Funktion 0 ist, gibt es keine Implementierung. Andernfalls liegt eine Implementierung vor.
Alternativer Ansatz
Sie können auch einen einfacheren Ansatz verwenden:
if b.A != nil { b.Foo() }
Wenn die eingebettete Schnittstelle festgelegt ist auf Null, der b.Foo()-Aufruf gerät in Panik. Andernfalls wird die Implementierung (falls vorhanden) ausgeführt.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection zuverlässig erkennen, ob eine eingebettete Schnittstelle in einer Go-Struktur über eine Funktionsimplementierung verfügt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!