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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 12:21:29859ブラウズ

How Can You Achieve Generic Programming with 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>

この冗長性を排除するには、インターフェイスの型を利用できます。

<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 nil
        }
    }
    return v
}</code>

この一般的な関数は、型で使用できます。{}クライアント コードでのアサーション:

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

または

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

ただし、このアプローチでは実行時のオーバーヘッドが発生します。場合によっては、個別の関数を保持し、コードの再構築を検討した方が効率的である可能性があります。

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

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