Maison  >  Article  >  développement back-end  >  Comment obtenir la signature d'une fonction Go sous forme de chaîne ?

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

DDD
DDDoriginal
2024-11-19 19:14:02774parcourir

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

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

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>

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!

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