ホームページ  >  記事  >  バックエンド開発  >  これら 2 つの関数を 1 つに結合する慣用的な方法

これら 2 つの関数を 1 つに結合する慣用的な方法

王林
王林転載
2024-02-05 22:33:04671ブラウズ

これら 2 つの関数を 1 つに結合する慣用的な方法

#質問内容

これら 2 つの非常によく似た関数があります。これらはそれぞれ、名前付きクエリ パラメーターから特定のベース/ビット長の整数を解析します。符号なし/符号付き整数を処理できる関数が 2 つあり、

strconv.ParseUint または strconv.ParseInt を呼び出す必要があります。

これらを 1 つの関数に減らすための簡潔で慣用的な方法は何ですか?インターフェイス (およびジェネリックス?) を使用するのが良いような気がしますが、どう進めればよいかわかりません。

//////////////////////////////////////////////////////////////////////

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
}


正解


次のようなユニバーサルパーサーを作成できます:

リーリー

として使用します:

リーリー

以上がこれら 2 つの関数を 1 つに結合する慣用的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。