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