Comment créer une tranche de fonctions avec différentes signatures dans Go ?
Le système de types de Go est typé statiquement, ce qui signifie que les fonctions doivent avoir une signature fixe au moment de la compilation. Cependant, il peut être utile de créer des tranches de fonctions pouvant accepter des arguments de différents types ou nombres.
Bien que le code fourni soit fonctionnel, il nécessite l'utilisation d'une instruction switch pour gérer chaque type de signature de fonction. Une solution plus concise et flexible consiste à utiliser la réflexion.
Voici un exemple :
package main import ( "fmt" "reflect" ) type Executor func(...interface{}) func main() { functions := []Executor{ func(a, b int) { fmt.Println(a + b) }, func(s string) { fmt.Println(s) }, func() { fmt.Println("No arguments") }, } for _, f := range functions { numIn := reflect.TypeOf(f).NumIn() args := make([]reflect.Value, numIn) for i := 0; i < numIn; i++ { switch reflect.TypeOf(f).In(i).Kind() { case reflect.Int: args[i] = reflect.ValueOf(12) case reflect.String: args[i] = reflect.ValueOf("Hello") default: args[i] = reflect.Value{} } } f.Call(args) } }
Dans cette solution, nous créons une tranche de fonctions Executor, qui sont des fonctions qui acceptent un nombre quelconque de arguments. Le package Reflect est utilisé pour déterminer le nombre et les types d'arguments attendus par chaque fonction et générer la tranche Reflect.Value correspondante.
L'utilisation de la réflexion nous permet d'appeler dynamiquement des fonctions avec des signatures variables sans avoir besoin d'un commutateur de type. ou interface{} tranches.
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!