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
Mary-Kate Olsenoriginal
2024-12-27 13:12:12622parcourir

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
}

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!

Déclaration:
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