Go Reflection mit in Struktur eingebetteter Schnittstelle: Erkennen des Vorhandenseins realer Funktionen
Betrachten Sie die folgende Struktur:
type A interface { Foo() string } type B struct { A bar string }
Während es idiomatisch erscheinen mag zu erwarten, dass B die Schnittstelle A implementieren muss, ermöglicht das Typsystem von Go die Einbettung von eine anonyme Schnittstelle, ohne dass eine explizite Implementierung erforderlich ist.
Reflection in Go ermöglicht den Zugriff auf Methoden eingebetteter Schnittstellen direkt über den Typ der enthaltenden Struktur. Dies kann jedoch zu unerwarteten Fehlern führen, insbesondere wenn die eingebettete Schnittstelle zur Laufzeit keine implementierende Funktion hat.
Um mithilfe von Reflektion festzustellen, ob eine echte Funktion für eine in eine Struktur eingebettete Schnittstelle vorhanden ist, können Sie Folgendes verwenden Technik:
Dieser Ansatz prüft effektiv, ob der Zeiger auf die Funktion im anonymen Schnittstellenwert Null ist. Hier ein Beispiel:
func main() { bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if has && bMeth != nil { fmt.Printf("HAS IT: %s\n", bMeth.Type.Kind()) // Call the function if it exists res := bMeth.Func.Call([]reflect.Value{reflect.ValueOf(B{})}) val := res[0].Interface() fmt.Println(val) } else { fmt.Println("DOESNT HAS IT") } }
Mit dieser Methode können Sie das Vorhandensein einer echten Funktion für eine eingebettete Schnittstelle sicher erkennen, ohne Fehler auszulösen. Es bietet eine Möglichkeit, festzustellen, ob die Schnittstelle teilweise implementiert ist oder nicht, und entsprechend zu handeln.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection sicher das Vorhandensein eingebetteter Schnittstellenfunktionen in Go erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!