Saya mempunyai dua fungsi yang hampir sama. Mereka masing-masing menghuraikan integer panjang asas/bit tertentu daripada parameter pertanyaan bernama. Terdapat dua fungsi yang boleh mengendalikan integer tidak bertanda/ditandatangani dan perlu dipanggil strconv.ParseUint
或 strconv.ParseInt
.
Apakah cara ringkas dan idiomatik untuk mengurangkan ini kepada satu fungsi? Saya rasa seperti menggunakan antara muka (dan generik?) adalah cara untuk pergi, tetapi saya tidak pasti bagaimana untuk meneruskan.
////////////////////////////////////////////////////////////////////// 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 }
Anda boleh membuat penghurai universal seperti ini:
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 }
dan gunakannya sebagai:
value, err:=ParseQueryParam[int64]("param",values, func(s string) (int64,error) { return strconv.ParseInt(s,10,64) })
Atas ialah kandungan terperinci Cara idiomatik untuk menggabungkan kedua-dua fungsi ini menjadi satu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!