Maison > développement back-end > Golang > Comment obtenir par programme la signature complète d'une fonction Go sous forme de chaîne ?

Comment obtenir par programme la signature complète d'une fonction Go sous forme de chaîne ?

Mary-Kate Olsen
Libérer: 2024-11-19 18:05:03
original
282 Les gens l'ont consulté

How to Programmatically Get a Go Function's Full Signature as a String?

Comment obtenir la signature d'une fonction sous forme de chaîne dans Go

Dans le contexte du développement Go, vous pouvez rencontrer des scénarios dans lesquels vous devez récupérer par programme la signature d'une fonction comme une chaîne. Comprendre comment y parvenir est crucial pour effectuer une introspection de type avancée et une gestion des erreurs.

Contexte

Le package Reflect de Go offre des capacités de réflexion étendues, y compris la possibilité d'obtenir le reflet.Type d'une fonction. Cependant, reflect.Type.String() ne renvoie que le nom du type, ce qui ne fournit pas toujours suffisamment d'informations.

Obtention de la signature

Pour obtenir la signature complète de la fonction, nous devons nous plonger dans le reflet .Type pour extraire manuellement les types de paramètres et de résultats. Voici une fonction qui fait cela :

func signature(f interface{}) string {
    t := reflect.TypeOf(f)
    if t.Kind() != reflect.Func {
        return "<not a function>"
    }

    buf := strings.Builder{}
    buf.WriteString("func (")
    for i := 0; i < t.NumIn(); i++ {
        if i > 0 {
            buf.WriteString(", ")
        }
        buf.WriteString(t.In(i).String())
    }
    buf.WriteString(")")
    if numOut := t.NumOut(); numOut > 0 {
        if numOut > 1 {
            buf.WriteString(" (")
        } else {
            buf.WriteString(" ")
        }
        for i := 0; i < t.NumOut(); i++ {
            if i > 0 {
                buf.WriteString(", ")
            }
            buf.WriteString(t.Out(i).String())
        }
        if numOut > 1 {
            buf.WriteString(")")
        }
    }

    return buf.String()
}
Copier après la connexion

Exemple d'utilisation

var myFunc ModuleInitFunc

fmt.Println(signature(func(i int) error { return nil }))
fmt.Println(signature(myFunc))
fmt.Println(signature(time.Now))
fmt.Println(signature(os.Open))
fmt.Println(signature(log.New))
fmt.Println(signature(""))
Copier après la connexion

Sortie

func (int) error
func (int) error
func () time.Time
func (string) (*os.File, error)
func (io.Writer, string, int) *log.Logger
<not a function>
Copier après la connexion

Limitations

Il est important de noter que cela L'approche ne capture pas les noms des paramètres ou des types de résultats. En effet, Go ne stocke pas ces informations au moment de l'exécution.

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