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?

Wie kann ich mithilfe von Reflection zuverlässig erkennen, ob eine eingebettete Schnittstelle in einer Go-Struktur über eine Funktionsimplementierung verfügt?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-22 19:35:11418Durchsuche

How Can I Reliably Detect If an Embedded Interface in a Go Struct Has a Function Implementation Using Reflection?

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!

Stellungnahme:
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