Récupération de la signature d'une fonction sous forme de chaîne dans Go
Dans Go, déterminer la signature d'une fonction avec un nom et une signature spécifiques dans le Le package principal est crucial pour fournir des messages d'erreur informatifs en cas de divergences.
Peut refléter.Type.String() Récupérer le Signature ?
Bien que reflex.Type.String() propose le nom du type (comme main.ModuleInitFunc), il ne parvient pas à fournir la signature complète. Cela est particulièrement évident lorsqu'il s'agit de valeurs de fonction qui ont des types nommés.
Construction de la signature
Pour construire la signature, nous devons collecter manuellement les informations du reflet.Type .
Exemple d'implémentation
Ci-dessous un exemple de fonction qui génère la signature d'une valeur de fonction :
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } ... return buf.String() }
Cette fonction construit la signature en parcourant les types d'entrée et de sortie et en les assemblant dans une chaîne lisible par l'homme.
Test de la fonction de signature
Le test de la fonction de signature donne les résultats suivants :
fmt.Println(signature(func(i int) error { return nil })) // func (int) error fmt.Println(signature(myFunc)) // func (int) error fmt.Println(signature(time.Now)) // func () time.Time fmt.Println(signature(os.Open)) // func (string) (*os.File, error) fmt.Println(signature(log.New)) // func (io.Writer, string, int) *log.Logger fmt.Println(signature("")) // <not a function>
Il est important de noter que Go ne donne pas accès aux noms de paramètres et de types de résultats, ils sont donc omis du signature.
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!