Go Reflection mit in Struct eingebetteter Schnittstelle: Identifizieren „echter“ Funktionen
Bedenken Sie den folgenden Codeausschnitt:
type A interface { Foo() string } type B struct { A bar string }
Gemäß dem idiomatischen Ansatz von Go legt das obige Muster nahe, dass B die A-Schnittstelle implementieren muss. Im Gegensatz zu OOP-Sprachen gibt es hierfür jedoch keine Überprüfung zur Kompilierungszeit. Stattdessen können Sie sich dafür entscheiden, nur einen Teil der Schnittstelle zu implementieren.
Mit Reflection können Sie Methoden von A direkt vom Typ B abrufen, auch wenn keine Methode mit Empfänger B vorhanden ist. Dies wirft jedoch die Frage auf: Wie kann man erkennen, ob eine „echte“ Implementierung existiert, bevor man Panik auslöst?
Um dieses Problem zu lösen, kann man sich nicht allein auf Reflexion verlassen. Erwägen Sie stattdessen die Verwendung eines einfachen Ansatzes:
method_in_table := B.Foo // Check if the method is nil if method_in_table == nil { fmt.Println("No real implementation found") } else { // Method is present }
Alternativ können Sie die folgende reflexionsbasierte Prüfung verwenden:
bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if !has || bMeth.Func.ptr.IsZero() { // No real implementation found } else { // Method is present }
In diesem Szenario wird überprüft, ob das ptr-Feld des bMeth Wenn die Funktion Null ist, können Sie feststellen, ob sich die Funktion in der Funktionstabelle des anonymen Schnittstellenwerts befindet. Wenn es Null ist, gibt es keine entsprechende Methode in der B-Struktur, was auf einen Mangel an echter Implementierung hindeutet.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection eine „echte' Schnittstellenimplementierung in Go erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!