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