Heim > Backend-Entwicklung > Golang > Wie kann ich mithilfe von Reflection eine „echte' Schnittstellenimplementierung in Go erkennen?

Wie kann ich mithilfe von Reflection eine „echte' Schnittstellenimplementierung in Go erkennen?

Patricia Arquette
Freigeben: 2024-12-23 22:29:19
Original
445 Leute haben es durchsucht

How Can I Detect a

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage