Maison > développement back-end > Golang > Comment puis-je gérer efficacement des tranches de fonctions avec des signatures variables dans Go ?

Comment puis-je gérer efficacement des tranches de fonctions avec des signatures variables dans Go ?

Linda Hamilton
Libérer: 2024-11-27 10:38:14
original
635 Les gens l'ont consulté

How Can I Efficiently Manage Slices of Functions with Varying Signatures in Go?

Implémentation de tranches de fonctions avec des signatures variables

Problème :

Créer une tranche de fonctions avec des signatures variables dans Golang est stimulant. En utilisant l'extrait de code fourni, l'approche semble quelque peu « hacky ». Est-il nécessaire d'utiliser une tranche d'interface{} comme solution de contournement ?

Solution :

Utiliser une tranche d'interface{} est en effet une solution valable pour créer des tranches contenant des fonctions avec des signatures différentes. Cependant, une approche alternative consiste à tirer parti de la réflexion pour déterminer dynamiquement le nombre et les types de paramètres d'entrée pour chaque fonction.

Voici un exemple de code alternatif illustrant l'utilisation de la réflexion :

package main

import (
    "fmt"
    "reflect"
)

func A() {
    fmt.Println("A")
}

func B(a int) {
    fmt.Println("B", a)
}

func C(a string, b float32) {
    fmt.Println("C", a, b)
}

func main() {
    f := []interface{}{A, B, C}

    for _, v := range f {
        fn := reflect.ValueOf(v)
        fmt.Printf("Function: %v\n", fn.Type())

        numArgs := fn.Type().NumIn()
        fmt.Printf("Number of arguments: %v\n", numArgs)

        for i := 0; i < numArgs; i++ {
            argType := fn.Type().In(i)
            fmt.Printf("Arg %v Type: %v\n", i+1, argType)
        }

        fmt.Printf("Calling function using reflection...\n")
        callArgs := []reflect.Value{}
        for i := 0; i < numArgs; i++ {
            switch fn.Type().In(i).Kind() {
            case reflect.Int:
                callArgs = append(callArgs, reflect.ValueOf(i+1))
            case reflect.String:
                callArgs = append(callArgs, reflect.ValueOf(fmt.Sprintf("Arg-%v", i+1)))
            case reflect.Float32:
                callArgs = append(callArgs, reflect.ValueOf(float32(i+1)))
            }
        }
        fn.Call(callArgs)
    }
}
Copier après la connexion

Cette approche fournit un accès direct aux paramètres de fonction individuels (types et valeurs) par réflexion, permettant une gestion plus dynamique des tranches de fonctions avec des signatures différentes.

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