Maison >développement back-end >Golang >Comment pouvons-nous identifier les types non intégrés dans Go en utilisant la réflexion sans liste de types ?
Identifier les types non intégrés à l'aide de Reflect
Question :
Différencier les types tels que []byte et tapez A []byte utilisant Reflect est un défi courant. Comment pouvons-nous distinguer ces types sans nous appuyer sur une liste définie de types à vérifier ?
Introduction :
Contexte sur les types :
Comprendre la classification des types dans Go est crucial. Il existe deux catégories principales : les types nommés et les types sans nom. Les types nommés sont déclarés à l'aide du mot-clé type, tandis que les types sans nom sont créés à l'aide de littéraux de type. Les types prédéfinis, tels que int et string, sont également disponibles pour une utilisation immédiate.
Utilisation de Type.Name() et Type.PkgPath() :
Type.Name () renvoie le nom d'un type nommé, tandis que Type.PkgPath() renvoie le chemin du package pour les types nommés et prédéclarés. Cela nous permet de séparer les types sans nom (Type.Name() vide) des types nommés et prédéclarés.
Cas particuliers :
Les types de structures anonymes et les types de cartes nécessitent des types spéciaux considération. Les types de structure anonymes peuvent contenir des champs de types personnalisés, nous devons donc vérifier les champs de manière récursive en utilisant Type.Elem(). De même, pour les cartes, nous devons vérifier à la fois les types de clé et de valeur.
Exemple d'implémentation :
Voici un exemple de code qui fait la différence entre les types intégrés et non intégrés :
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 }
Utilisation :
Nous pouvons tester le Fonction isCustom() avec différents types :
fmt.Println(isCustom(reflect.TypeOf(int(2)))) // false fmt.Println(isCustom(reflect.TypeOf(A{}))) // true fmt.Println(isCustom(reflect.TypeOf(map[K]int{}))) // 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!