Maison >développement back-end >Golang >Comment puis-je découvrir tous les types exportés dans un package Go au moment de l'exécution ?

Comment puis-je découvrir tous les types exportés dans un package Go au moment de l'exécution ?

DDD
DDDoriginal
2025-01-05 21:04:45822parcourir

How Can I Discover All Exported Types in a Go Package at Runtime?

Découverte des packages pendant l'exécution

Contrairement au package Reflect, Go ne dispose pas d'un mécanisme de découverte de types qui permet d'interroger tous les types sans les connaître explicitement. Cela soulève la question :

Existe-t-il une méthode alternative pour découvrir tous les types exportés (les structures en particulier) dans un package Go actif ?

Une solution théorique est une solution hypothétique fonction, « DiscoverTypes », qui prend un package et renvoie tous les types découverts. Cependant, cette fonction n'existe pas dans le package Reflect.

Trouver une solution

Dans Go 1.5 et versions ultérieures, les nouveaux types de packages et l'importateur offrent un moyen de inspecter les packages binaires et sources. En utilisant le code suivant, vous pouvez découvrir tous les types exportés au sein d'un package :

package main

import (
    "fmt"
    "go/importer"
)

func main() {
    pkg, err := importer.Default().Import("time")
    if err != nil {
        fmt.Printf("error: %s\n", err.Error())
        return
    }
    for _, declName := range pkg.Scope().Names() {
        fmt.Println(declName)
    }
}

Cependant, dans les versions antérieures à 1.5, la seule approche fiable consiste à utiliser le package ast pour compiler le code source.

Cas d'utilisation réel

Cette fonctionnalité est particulièrement utile dans les utilitaires de génération de code qui identifient et instancient des types répondant à des besoins spécifiques. critères. Ces utilitaires aident à générer des fonctions de test basées sur les types découverts et réduisent le besoin d'étapes de génération manuelle de code.

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