Maison > développement back-end > Golang > Comment récupérer la signature d'une fonction Go sous forme de chaîne ?

Comment récupérer la signature d'une fonction Go sous forme de chaîne ?

Linda Hamilton
Libérer: 2024-12-03 10:55:15
original
898 Les gens l'ont consulté

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

Récupération de la signature d'une fonction sous forme de chaîne dans Go

Problème :

Dans un module Go conçu pour charger des plugins, il est essentiel de s'assurer qu'une fonction spécifique avec un nom et une signature prédéterminés existe dans le package principal. Si cette fonction est absente ou ne correspond pas à la signature attendue, un message d'erreur descriptif est nécessaire. Étant donné une variable de type de fonction, comment obtenir la signature sous-jacente ?

Solution :

Se fier simplement à Reflect.Type.String() ne fournit que le nom du type, tel que main.ModuleInitFunc. Pour récupérer la signature complète, nous devons la construire manuellement à l'aide des informations fournies par Reflect.Type.

Mise en œuvre :

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

Utilisation :

En passant une variable de fonction à la fonction signature(), nous pouvons obtenir la signature correspondante sous forme de chaîne. Par exemple :

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

Remarque :

Il est crucial de reconnaître que c'est impossible pour extraire les noms des paramètres et des types de résultats de la signature puisque Go ne stocke ni ne donne accès à ces informations.

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