我有這兩個非常相似的功能。它們各自從命名查詢參數中解析特定基數/位元長度的整數。有兩個函數可以處理無符號/有符號整數,需要呼叫 strconv.ParseUint
或 strconv.ParseInt
。
將這些簡化為單一函數的簡潔慣用方法是什麼?我覺得使用介面(和泛型?)是可行的方法,但我不確定如何繼續。
////////////////////////////////////////////////////////////////////// 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 }
你可以這樣製作一個通用解析器:
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 }
並將其用作:
value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) { return strconv.ParseInt(s,10,64) })
以上是將這兩個函數合而為一的慣用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!