Maison >développement back-end >Golang >Manière idiomatique de combiner ces deux fonctions en une seule

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

王林
王林avant
2024-02-05 22:33:04689parcourir

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
}

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
}

et utilisez-le comme :

value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) {
  return strconv.ParseInt(s,10,64)
})

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer