Heim >Backend-Entwicklung >Golang >Wie können wir mithilfe von Reflection zwischen integrierten und benutzerdefinierten Typen in Go unterscheiden?

Wie können wir mithilfe von Reflection zwischen integrierten und benutzerdefinierten Typen in Go unterscheiden?

Susan Sarandon
Susan SarandonOriginal
2024-12-25 21:11:17442Durchsuche

How Can We Distinguish Between Built-in and Custom Types in Go Using Reflection?

Identifizieren nicht integrierter Typen mithilfe von Reflexion

Problem:

Unterscheidung zwischen Typen wie [ ]Byte und Typ A []Byte unter Verwendung von Reflection erweist sich als schwierig, wenn Reflect.TypeOf(A{}).Kind beide als angibt Byte-Scheiben. Es wird notwendig, einen Weg zu finden, diese Typen zu unterscheiden, ohne sich auf vordefinierte Typenlisten zu verlassen.

Hintergrund:

Typen in Go können als benannt kategorisiert werden ( mit einem Typnamen) oder unbenannt (mithilfe eines Typliterals) sein. Vordeklarierte Typen (wie string oder int) werden benannt, während Typen, die mit Typliteralen (wie []int oder struct{i int}) erstellt wurden, unbenannt sind.

Lösung:

Mit Type.PkgPath():

Type.PkgPath() stellt die bereit Paketpfad eines benannten Typs. Für vordeklarierte oder unbenannte Typen ist dieser Pfad leer. Somit können nicht integrierte Typen identifiziert werden, indem überprüft wird, ob Type.PkgPath() eine nicht leere Zeichenfolge zurückgibt.

Umgang mit unbenannten Typen, die von benutzerdefinierten Typen abgeleitet sind:

Die Verwendung von Typliteralen mit benutzerdefinierten Typen kann zu unbenannten Typen führen (z. B. []A). Um festzustellen, ob ein unbenannter Typ von einem benutzerdefinierten Typ abgeleitet ist, überprüfen Sie den Elementtyp mit Type.Elem():

if elem := t.Elem(); elem.Kind() == reflect.Ptr || elem.Kind() == reflect.Struct {
    // Recursively check elem
}

Sonderfälle:

  • Anonyme Strukturtypen: Überprüfen Sie die Strukturfelder und prüfen Sie, ob es eine benutzerdefinierte Struktur gibt Typ.
  • Kartentypen:Untersuchen Sie sowohl den Schlüssel- als auch den Werttyp der Karte.

Beispielimplementierung:

Der folgende Code definiert eine Dienstprogrammfunktion isCustom, um nicht integrierte Funktionen zu identifizieren Typen:

func isCustom(t reflect.Type) bool {
    if t.PkgPath() != "" {
        return true
    }
    // Handle special cases and recursion for unnamed types
    return false
}

Testen der Lösung:

fmt.Println(isCustom(reflect.TypeOf(""))) // false (builtin)
fmt.Println(isCustom(reflect.TypeOf(A{}))) // true (custom)

Das obige ist der detaillierte Inhalt vonWie können wir mithilfe von Reflection zwischen integrierten und benutzerdefinierten Typen in Go unterscheiden?. 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