ホームページ  >  記事  >  バックエンド開発  >  テンプレートを使用せずに汎用の可変個引数関数を実現するにはどうすればよいでしょうか?

テンプレートを使用せずに汎用の可変個引数関数を実現するにはどうすればよいでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 20:09:02145ブラウズ

 How Can Go Achieve Generic Variadic Functions Without Templates?

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
}

// etc. for various types</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>

GetValueFromDb 関数はインターフェイス{}も返す必要があります。クライアント コードでは、型アサーションを使用して値を変換し、取得できます:

<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>

これにより実行時のオーバーヘッドが発生しますが、コードを再構築して関数を分離する方が効率的である可能性があります。 .

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

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