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
Mary-Kate Olsenoriginal
2025-01-05 03:09:39820parcourir

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
}

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

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