Maison > développement back-end > Golang > Comment pouvons-nous distinguer les types personnalisés des types intégrés à l'aide de Go Reflection ?

Comment pouvons-nous distinguer les types personnalisés des types intégrés à l'aide de Go Reflection ?

Mary-Kate Olsen
Libérer: 2025-01-05 03:09:39
original
773 Les gens l'ont consulté

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

Identification des types non intégrés à l'aide de la réflexion

Identification des types personnalisés

Pour différencier les types personnalisés des types prédéfinis, nous pouvons utiliser deux méthodes de réflexion :

  • Type.PkgPath() : renvoie le chemin de package d’un type nommé. Les types prédéfinis ont un chemin de package vide.
  • Type.Name() : renvoie le nom d'un type nommé. Les types sans nom renvoient une chaîne vide.

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.

Gestion des cas particuliers

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().

Exemple d'implémentation

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
}
Copier après la connexion

Tests

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal