Maison > développement back-end > Golang > le corps du texte

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

DDD
Libérer: 2024-11-19 19:14:02
original
770 Les gens l'ont consulté

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

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

Votre requête concerne la récupération de la signature, une représentation sous forme de chaîne de la fonction type, étant donné une variable de fonction.

Comprendre Reflect.Type.String()

La méthode Reflect.Type.String() renvoie le nom du type, pas la signature complète. Lorsque la valeur de la fonction est un littéral de fonction (type sans nom), elle imprime la signature.

Construction manuelle de la signature

Pour récupérer la signature d'un type nommé, les informations du reflet.Type est nécessaire. Voici une fonction qui construit la signature :

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

Test de la fonction

Exemple de sortie de la fonction de signature :

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 attendue :

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

Remarque : L'impression des noms des paramètres et des types de résultats n'est pas possible en raison du manque d'informations accessibles.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal