Maison > développement back-end > Golang > Comment exécuter un rappel de type générique soumis à plusieurs types de retour ?

Comment exécuter un rappel de type générique soumis à plusieurs types de retour ?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2024-02-12 17:06:05
avant
779 Les gens l'ont consulté

Comment exécuter un rappel de type générique soumis à plusieurs types de retour ?

Contenu de la question

J'essaie d'autoriser un paramètre de rappel dans ma fonction qui permet plusieurs tuples de retour. Pour y parvenir, j'utilise des génériques pour définir les types de paramètres du rappel.

func get[
    in any,
    out any,
    translatefn func(in) out | func(in) (out, error),
](
    input in,
    translate translatefn,
) (*out, error) {
    // call translate to convert the input to the output.
    // if translate is an erroring function, make sure the error is
    // forwarded to the response of this function.
}
Copier après la connexion

Étant donné que translatefn est limité à l'un ou l'autre de ces deux types de retour (out(out, error)), j'ai pensé pouvoir l'appeler.

Ce que je veux faire est quelque chose comme ci-dessous, mais je ne peux pas car je ne peux pas utiliser d'assertion de type sur le paramètre translate.

invalid operation: cannot use type assertion on type parameter value translate (variable of type translatefn constrained by func(in) out|func(in) (out, error))
Copier après la connexion
func Get[
    In any,
    Out any,
    TranslateFn func(In) Out | func(In) (Out, error),
](
    input In,
    translate TranslateFn,
) (*Out, error) {
    if erroringFn, isErroringTranslateFn := translate.(func(In) (Out, error)); isErroringTranslateFn {
        out, err := erroringFn(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    }

    if nonErroringFn, isNonErroringTranslateFn := translate.(func(In) Out); isNonErroringTranslateFn {
        out, err := nonErroringFn(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    }

    panic("translate function must be either func(In) (Out, error) or func(In) Out")
}
Copier après la connexion

Comment puis-je appeler ce rappel sans assertion de type, ou déterminer quelles variantes courantes sont fournies ?

Solution de contournement

Enveloppez-le d'abord dans une interface, puis effectuez une assertion de type (ou un changement de type). Par exemple. any(v).(t)

func Get[
    In any,
    Out any,
    TranslateFn func(In) Out | func(In) (Out, error),
](
    input In,
    translate TranslateFn,
) (*Out, error) {
    switch f := any(translate).(type) {
    case func(In) (Out, error):
        out, err := f(input)
        if err != nil {
            return nil, err
        }
        return &out, nil
    case func(In) Out:
        out := f(input)
        return &out, nil
    }

    panic("shouldn't happen")
}

Copier après la connexion

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal