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

Manière idiomatique de combiner ces deux fonctions en une seule

王林
Libérer: 2024-02-05 22:33:04
avant
670 Les gens l'ont consulté

Manière idiomatique de combiner ces deux fonctions en une seule

Contenu de la question

J'ai ces deux fonctions très similaires. Ils analysent chacun un entier de base/longueur de bits spécifique à partir d'un paramètre de requête nommé. Il existe deux fonctions qui peuvent gérer des entiers non signés/signés et doivent être appelées strconv.ParseUintstrconv.ParseInt.

Quelle est une manière concise et idiomatique de les réduire à une seule fonction ? J'ai l'impression que l'utilisation d'interfaces (et de génériques ?) est la voie à suivre, mais je ne sais pas comment procéder.

//////////////////////////////////////////////////////////////////////

func ParseQueryParamUnsigned(name string, base int, bits int, values *url.Values) (uint64, error) {

    param := (*values)[name]

    if len(param) < 1 {
        return 0, fmt.Errorf("missing parameter %s", name)
    }

    if len(param) > 1 {
        return 0, fmt.Errorf("duplicate parameter %s", name)
    }

    v, err := strconv.ParseUint(param[0], base, bits)

    if err != nil {
        return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
    }
    return v, nil
}

//////////////////////////////////////////////////////////////////////

func ParseQueryParamSigned(name string, base int, bits int, values *url.Values) (int64, error) {

    param := (*values)[name]

    if len(param) < 1 {
        return 0, fmt.Errorf("missing parameter %s", name)
    }

    if len(param) > 1 {
        return 0, fmt.Errorf("duplicate parameter %s", name)
    }

    v, err := strconv.ParseInt(param[0], base, bits)

    if err != nil {
        return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
    }
    return v, nil
}
Copier après la connexion


Bonne réponse


Vous pouvez créer un analyseur universel comme celui-ci :

func ParseQueryParam[T any](name string, values url.Values, parser func(string) (T,error)) (T, error) {

    param := values[name]

    if len(param) < 1 {
        return 0, fmt.Errorf("missing parameter %s", name)
    }

    if len(param) > 1 {
        return 0, fmt.Errorf("duplicate parameter %s", name)
    }

    v, err := parser(param[0])

    if err != nil {
        return 0, fmt.Errorf("bad value for '%s' (%s)", name, err.Error())
    }
    return v, nil
}
Copier après la connexion

et utilisez-le comme :

value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) {
  return strconv.ParseInt(s,10,64)
})
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!

source:stackoverflow.com
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