Ich habe diese beiden sehr ähnlichen Funktionen. Sie analysieren jeweils eine bestimmte Basis-/Bitlängen-Ganzzahl aus einem benannten Abfrageparameter. Es gibt zwei Funktionen, die vorzeichenlose/vorzeichenbehaftete Ganzzahlen verarbeiten können und aufgerufen werden müssen strconv.ParseUint
或 strconv.ParseInt
.
Was ist eine prägnante und idiomatische Möglichkeit, diese auf eine einzige Funktion zu reduzieren? Ich habe das Gefühl, dass die Verwendung von Schnittstellen (und Generika?) der richtige Weg ist, bin mir aber nicht sicher, wie ich vorgehen soll.
////////////////////////////////////////////////////////////////////// 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 }
Sie können einen universellen Parser wie folgt erstellen:
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 }
und verwenden Sie es als:
value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) { return strconv.ParseInt(s,10,64) })
Das obige ist der detaillierte Inhalt vonIdiomatische Art, diese beiden Funktionen zu einer zu kombinieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!