Heim > Backend-Entwicklung > Golang > Wie können wir nicht integrierte Typen in Go mithilfe von Reflection ohne Typauflistung identifizieren?

Wie können wir nicht integrierte Typen in Go mithilfe von Reflection ohne Typauflistung identifizieren?

Mary-Kate Olsen
Freigeben: 2024-12-27 13:12:12
Original
579 Leute haben es durchsucht

How Can We Identify Non-Builtin Types in Go Using Reflection Without Type Listing?

Identifizieren nicht integrierter Typen mithilfe von Reflect

Frage:

Unterscheiden zwischen Typen wie []Byte und Typ A []Byte mit Reflect ist eine häufige Herausforderung. Wie können wir zwischen diesen Typen unterscheiden, ohne uns auf eine definierte Liste von Typen zur Prüfung zu verlassen?

Einführung:

Hintergrundinformationen zu Typen:
Es ist von entscheidender Bedeutung, die Klassifizierung von Typen in Go zu verstehen. Es gibt zwei Hauptkategorien: benannte und unbenannte Typen. Benannte Typen werden mit dem Schlüsselwort type deklariert, während unbenannte Typen mit Typliteralen erstellt werden. Vordeklarierte Typen wie int und string stehen ebenfalls zur sofortigen Verwendung zur Verfügung.

Verwenden von Type.Name() und Type.PkgPath():

Type.Name () gibt den Namen eines benannten Typs zurück, während Type.PkgPath() den Paketpfad sowohl für benannte als auch für vordeklarierte Typen zurückgibt. Dies ermöglicht uns, unbenannte Typen (leerer Type.Name()) von benannten und vordeklarierten Typen zu trennen.

Sonderfälle:

Anonyme Strukturtypen und Kartentypen erfordern besondere Anforderungen Rücksichtnahme. Anonyme Strukturtypen können Felder benutzerdefinierter Typen enthalten, daher müssen wir die Felder rekursiv mit Type.Elem() überprüfen. Ebenso müssen wir für Karten sowohl den Schlüssel- als auch den Werttyp überprüfen.

Beispielimplementierung:

Hier ist ein Codebeispiel, das zwischen integrierten und nicht integrierten Typen unterscheidet:

func isCustom(t reflect.Type) bool {
    if t.PkgPath() != "" {
        return true
    }

    if k := t.Kind(); k == reflect.Array || k == reflect.Chan || k == reflect.Map ||
        k == reflect.Ptr || k == reflect.Slice {
        return isCustom(t.Elem()) || k == reflect.Map && isCustom(t.Key())
    } else if k == reflect.Struct {
        for i := t.NumField() - 1; i >= 0; i-- {
            if isCustom(t.Field(i).Type) {
                return true
            }
        }
    }

    return false
}
Nach dem Login kopieren

Verwendung:

Wir können testen die Funktion isCustom() mit verschiedenen Typen:

fmt.Println(isCustom(reflect.TypeOf(int(2))))            // false
fmt.Println(isCustom(reflect.TypeOf(A{})))               // true
fmt.Println(isCustom(reflect.TypeOf(map[K]int{})))       // true
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie können wir nicht integrierte Typen in Go mithilfe von Reflection ohne Typauflistung identifizieren?. 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