ホームページ  >  記事  >  バックエンド開発  >  テンプレートやオーバーロードされた関数を使用せずに、Go で可変引数関数の汎用プログラミングを実現するにはどうすればよいですか?

テンプレートやオーバーロードされた関数を使用せずに、Go で可変引数関数の汎用プログラミングを実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 01:56:03749ブラウズ

How Can You Achieve Generic Programming for Variadic Functions in Go Without Templates or Overloaded Functions?

Go の汎用可変引数引数

Go にはテンプレートやオーバーロードされた関数がないにもかかわらず、可変個引数関数に対して何らかの形式の汎用プログラミングを実現することが可能です。

冗長な関数コードの問題

提供されたコード スニペットに示されているように、多くの関数は同様のロジックを共有しますが、異なる型を処理します。この繰り返しによりコードが冗長になる可能性があります。

解決策: Interface{} タイプ

冗長性を減らす 1 つのアプローチは、Go のインターフェース{} タイプ、つまり互換性のある特別なタイプを利用することです。すべてのタイプで。インターフェイスの値を受け入れたり返したりするように関数を変更することで、共通ロジックを一元化できます。

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

クライアント コード

クライアント コードでは、Get 関数を使用して次のことができます。{}特定の型の値を取得するために使用されます:

<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 までご連絡ください。