Heim >Backend-Entwicklung >Golang >Wie können wir mithilfe von Reflection zwischen integrierten und benutzerdefinierten Typen in Go unterscheiden?
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:
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!