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.
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.
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() }
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(""))
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
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!