Maison > développement back-end > Golang > le corps du texte

Comment puis-je créer une tranche de fonctions avec différentes signatures dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-26 05:01:10
original
351 Les gens l'ont consulté

How Can I Create a Slice of Functions with Different Signatures in Go?

Création d'une tranche de fonctions avec différentes signatures

Problème

Comment créer une tranche de fonctions avec différentes signatures dans Go ?

Context

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.

Solution

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)
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal