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.ParseUint
或 strconv.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 }
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!