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 ?

Comment pouvons-nous identifier les types non intégrés dans Go en utilisant la réflexion sans liste de types ?

Mary-Kate Olsen
Libérer: 2024-12-27 13:12:12
original
627 Les gens l'ont consulté

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

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

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
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