ホームページ  >  記事  >  バックエンド開発  >  Go で可変個引数関数の汎用プログラミングを実現するにはどうすればよいですか?

Go で可変個引数関数の汎用プログラミングを実現するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 07:47:30261ブラウズ

How to Achieve Generic Programming for Variadic Functions in Go?

Go での可変個引数関数のジェネリック プログラミング

Go にはテンプレートやオーバーロードされた関数がないにもかかわらず、何らかの形式のジェネリック プログラミングを実装することは可能です

データベースから値を取得し、要求された値が見つからない場合はデフォルト値を返す一連の関数を含む次の例を考えてみましょう。

<code class="go">func (this Document) GetString(name string, defaults ...string) string {
    v, ok := this.GetValueFromDb(name)
    if !ok {
        if len(defaults) >= 1 {
            return defaults[0]
        } else {
            return ""
        }
    }
    return v.asString
}

func (this Document) GetInt(name string, defaults ...int) int {
    v, ok := this.GetValueFromDb(name)
    if !ok {
        if len(defaults) >= 1 {
            return defaults[0]
        } else {
            return 0
        }
    }
    return v.asInt
}</code>

コードを削除するには冗長性を確保するには、インターフェイス タイプを使用して汎用 Get() 関数を実装できます。

<code class="go">func (this Document) Get(name string, defaults ...interface{}) interface{} {
    v, ok := this.GetValueFromDb(name)
    if !ok {
        if len(defaults) >= 1 {
            return defaults[0]
        } else {
            return 0
        }
    }
    return v
}</code>

クライアント コードでは、それに応じて戻り値を型キャストできます。

<code class="go">value := document.Get("index", 1).(int)  // Panics when the value is not int

value, ok := document.Get("index", 1).(int)  // ok is false if the value is not int</code>

ただし, このアプローチでは、型変換による実行時のオーバーヘッドが発生します。コードをリファクタリングするか、タイプごとに別の関数を使用することを検討することをお勧めします。

以上がGo で可変個引数関数の汎用プログラミングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。