Go での型による関数の選択
さまざまな型の関数の配列またはスライスがあるシナリオを考えてみましょう。これらの関数を効率的に処理するには、整数などの特定の種類のデータを返したり受け取ったりする関数のみを選択することができます。これは、Go リフレクション パッケージを使用して実現できます。
リフレクション パッケージは、実行時に値の型をイントロスペクトする手段を提供します。関数の入力型と出力型を検査することで、基準を満たすものを除外できます。
次のプログラム例を考えてみましょう。
<code class="go">package main import ( "fmt" "reflect" ) func main() { funcs := make([]interface{}, 3, 3) // I use interface{} to allow any kind of func funcs[0] = func(a int) int { return a + 1 } // good funcs[1] = func(a string) int { return len(a) } // good funcs[2] = func(a string) string { return ":(" } // bad for _, fi := range funcs { f := reflect.ValueOf(fi) functype := f.Type() good := false for i := 0; i < functype.NumIn(); i++ { if "int" == functype.In(i).String() { good = true // yes, there is an int among inputs break } } for i := 0; i < functype.NumOut(); i++ { if "int" == functype.Out(i).String() { good = true // yes, there is an int among outputs break } } if good { fmt.Println(f) } } }</code>
このプログラムでは、関数のスライス ([]interface{}) を使用して、さまざまなタイプの関数を保存します。次に、このスライスを反復処理し、関数ごとにリフレクションを使用してその型 (reflect.ValueOf(fi).Type()) を取得します。入力と出力の型を検査することで、関数が基準を満たしているかどうかを判断できます。この場合、整数を受け取るか返す関数をチェックします。そのような関数が見つかった場合は、出力に出力されます。
リフレクション パッケージは、関数を含む Go 値をイントロスペクトするための強力なメカニズムを提供します。この機能を活用すると、実行時に型に基づいて関数をフィルタリングして除外できるため、効率的かつ柔軟なコード操作が可能になります。
以上がGo リフレクションを使用して、入力と出力のタイプに基づいて関数を選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。