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

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

王林
リリース: 2024-02-05 22:33:04
転載
690 人が閲覧しました

これら 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート