Pour différencier les types personnalisés des types prédéfinis, nous pouvons utiliser deux méthodes de réflexion :
Les types personnalisés auront un chemin de package non vide et un nom non vide. À l'inverse, les types prédéfinis auront un chemin de package vide.
Types de structure anonymes :
Les types de structure anonymes ne sont pas nommés mais peuvent avoir champs de types personnalisés. Nous pouvons vérifier les types personnalisés en parcourant les champs de la structure et en vérifiant si l'un d'entre eux est personnalisé.
Types de cartes :
Les types de cartes peuvent avoir une clé ou une valeur personnalisée. genres. Nous pouvons interroger le type de valeur en utilisant Type.Elem() et le type de clé en utilisant Type.Key().
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 }
fmt.Println(isCustom(reflect.TypeOf(""))) // false fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf([]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(struct{ i int }{}))) // false fmt.Println(isCustom(reflect.TypeOf(&i))) // false fmt.Println(isCustom(reflect.TypeOf(map[string]int{}))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(&A{}))) // true fmt.Println(isCustom(reflect.TypeOf([]A{}))) // true fmt.Println(isCustom(reflect.TypeOf([][]A{}))) // true fmt.Println(isCustom(reflect.TypeOf(struct{ a A }{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[string]K{}))) // true
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!