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!