Maison  >  Article  >  développement back-end  >  Comment filtrer les fonctions Go en fonction des paramètres et des types de retour à l'aide de Reflection ?

Comment filtrer les fonctions Go en fonction des paramètres et des types de retour à l'aide de Reflection ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 00:15:02204parcourir

How to Filter Go Functions Based on Parameters and Return Types Using Reflection?

Filtrage des fonctions par paramètres et types de retour dans Go

Considérez un scénario dans lequel vous disposez d'une collection de fonctions et devez choisir de manière sélective celles qui répondre à des critères spécifiques, tels que renvoyer un entier ou prendre un entier comme paramètre d'entrée. Cette tâche peut être accomplie grâce à l'utilisation de la réflexion dans Golang.

Le package Reflect donne accès aux métadonnées sous-jacentes des types et des valeurs dans Go. En utilisant Reflect.ValueOf et Reflect.Type, nous pouvons inspecter les types de fonctions et récupérer des informations sur leurs paramètres et renvoyer les valeurs.

Pour sélectionner les fonctions qui renvoient un entier, nous parcourons chaque fonction de la liste et utilisons Reflect.ValueOf pour obtenir sa valeur. Nous récupérons ensuite le type de la fonction à l'aide de Reflect.Type et examinons ses valeurs de retour à l'aide de NumOut et Out. Si le type d'une valeur de retour est "int", nous marquons la fonction comme "bonne" pour l'inclusion.

De même, pour sélectionner des fonctions qui prennent un entier comme paramètre, nous parcourons les paramètres NumIn de la fonction et vérifiez le type de chaque entrée à l’aide de Reflect.In. Si "int" est trouvé parmi les types d'entrée, nous marquons la fonction comme "bonne".

Voici un exemple de programme qui montre comment utiliser cette approche :

<code class="go">package main

import (
    "fmt"
    "reflect"
)

func main() {
    funcs := make([]interface{}, 3, 3)
    funcs[0] = func(a int) int { return a + 1 }
    funcs[1] = func(a string) int { return len(a) }
    funcs[2] = func(a string) string { return ":(" }

    for _, fi := range funcs {
        f := reflect.ValueOf(fi)
        functype := f.Type()
        good := false

        for i := 0; i < functype.NumIn(); i++ {
            if functype.In(i).String() == "int" {
                good = true
                break
            }
        }

        for i := 0; i < functype.NumOut(); i++ {
            if functype.Out(i).String() == "int" {
                good = true
                break
            }
        }

        if good {
            fmt.Println(f)
        }
    }
}
````
</code>

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