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
Mary-Kate Olsenoriginal
2024-11-19 18:05:03292parcourir

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()
}

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(""))

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>

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!

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