Rumah >pembangunan bahagian belakang >Golang >Cara idiomatik untuk menggabungkan kedua-dua fungsi ini menjadi satu

Cara idiomatik untuk menggabungkan kedua-dua fungsi ini menjadi satu

王林
王林ke hadapan
2024-02-05 22:33:04690semak imbas

Cara idiomatik untuk menggabungkan kedua-dua fungsi ini menjadi satu

Kandungan soalan

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.ParseUintstrconv.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
}

Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam