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