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 サイトの他の関連記事を参照してください。