Heim > Backend-Entwicklung > Golang > Wie kann ich mithilfe von Reflection feststellen, ob eine Go-Struktur mit einer eingebetteten Schnittstelle über eine „echte' Funktionsimplementierung verfügt?

Wie kann ich mithilfe von Reflection feststellen, ob eine Go-Struktur mit einer eingebetteten Schnittstelle über eine „echte' Funktionsimplementierung verfügt?

DDD
Freigeben: 2024-12-26 18:04:11
Original
485 Leute haben es durchsucht

How Can I Determine if a Go Struct with an Embedded Interface Has a

Go-Reflexion mit eingebetteter Schnittstelle in Struct: Bestimmung „echter“ Funktionen

Im Kontext des Go-Reflexionspakets das Verhalten von struct verstehen Felder, die mit anonymen Schnittstellen eingebettet sind, sind von entscheidender Bedeutung. Betrachten Sie den folgenden Codeausschnitt:

type A interface {
    Foo() string
}

type B struct {
    A
    bar string
}
Nach dem Login kopieren

Während es intuitiv anzunehmen ist, dass B Schnittstelle A implementieren muss, lässt die dynamische Natur von Go eine andere Interpretation zu. Der eingebettete anonyme Schnittstellenwert in B dient als Feld, ähnlich wie andere Strukturfelder.

Mithilfe von Reflektion können Sie Methoden vom Typ B wie folgt abrufen:

bType := reflect.TypeOf(B{})
bMeth, has := bType.MethodByName("Foo")
Nach dem Login kopieren

Allerdings ist die Präsenz von bMeth garantiert nicht die Existenz einer „echten“ Funktionsimplementierung für B. Um Paniken wie die, die Sie erlebt haben, zu vermeiden, müssen Sie eine Möglichkeit finden, festzustellen, ob eine tatsächliche Funktion definiert ist B.

Erkennen des Fehlens einer Implementierung

Der Schlüssel zur Unterscheidung zwischen einer „echten“ Funktion und einer geerbten Schnittstellenmethode liegt im Schnittstellenaspekt des eingebetteten Anonymous Schnittstelle. Wenn in der Struktur keine explizite Implementierung vorhanden ist, wird die Schnittstellenmethode effektiv von der eingebetteten Schnittstelle geerbt.

So prüfen Sie, ob eine tatsächliche Funktion vorhanden ist:

if bMeth.Type.NumIn() == 1 && bMeth.Type.NumOut() == 1 {
    fmt.Println("Real function found")
} else {
    fmt.Println("Interface method inherited")
}
Nach dem Login kopieren

Diese Prüfung prüft die Nummer von Eingabe- und Ausgabeparametern für die abgerufene Methode. Wenn beide 1 sind, bedeutet dies, dass es sich bei der Methode um eine „echte“ Funktionsimplementierung handelt, da sie einen Empfängerparameter (die B-Instanz) akzeptiert und einen Wert zurückgibt. Wenn sich diese Zahlen andernfalls unterscheiden, wird die Methode von der Schnittstelle geerbt.

Alternativer Ansatz: Typumschaltung

Anstelle der Verwendung von Reflektion können Sie die Typumschaltung auf selektiv anwenden basierend auf dem dynamischen Typ von b.A. ausführen. Wenn b.A Null ist, weist dies auf das Fehlen einer „echten“ Implementierung hin.

switch b.A.(type) {
case nil:
    fmt.Println("No function implementation in B")
default:
    fmt.Println("Function implementation found")
}
Nach dem Login kopieren

Schlussfolgerung

Durch das Verständnis der Natur eingebetteter anonymer Schnittstellen und die Verwendung einer der beiden Reflexionen Mit benutzerdefinierten Prüfungen oder Typwechsel können Sie effektiv das Vorhandensein „echter“ Funktionen für Strukturfelder feststellen, die Schnittstellenmethoden erben.

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Reflection feststellen, ob eine Go-Struktur mit einer eingebetteten Schnittstelle über eine „echte' Funktionsimplementierung verfügt?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage