問題:
Golang でさまざまなシグネチャを持つ関数のスライスを作成するのは挑戦的。提供されたコード スニペットを使用すると、このアプローチはいくぶん「巧妙」に見えます。回避策としてインターフェイス{} スライスを利用する必要がありますか?
解決策:
インターフェイス{} スライスの使用は、関数を含むスライスを作成するための有効な解決策です。さまざまな署名が付いています。ただし、別のアプローチでは、リフレクションを利用して各関数の入力パラメーターの数とタイプを動的に決定します。
リフレクションの使用を示す代替コード サンプルを次に示します。
package main import ( "fmt" "reflect" ) func A() { fmt.Println("A") } func B(a int) { fmt.Println("B", a) } func C(a string, b float32) { fmt.Println("C", a, b) } func main() { f := []interface{}{A, B, C} for _, v := range f { fn := reflect.ValueOf(v) fmt.Printf("Function: %v\n", fn.Type()) numArgs := fn.Type().NumIn() fmt.Printf("Number of arguments: %v\n", numArgs) for i := 0; i < numArgs; i++ { argType := fn.Type().In(i) fmt.Printf("Arg %v Type: %v\n", i+1, argType) } fmt.Printf("Calling function using reflection...\n") callArgs := []reflect.Value{} for i := 0; i < numArgs; i++ { switch fn.Type().In(i).Kind() { case reflect.Int: callArgs = append(callArgs, reflect.ValueOf(i+1)) case reflect.String: callArgs = append(callArgs, reflect.ValueOf(fmt.Sprintf("Arg-%v", i+1))) case reflect.Float32: callArgs = append(callArgs, reflect.ValueOf(float32(i+1))) } } fn.Call(callArgs) } }
このアプローチリフレクションを通じて個々の関数パラメータ (型と値の両方) への直接アクセスを提供し、異なるシグネチャを持つ関数のスライスをより動的に処理できるようにします。
以上がGo でさまざまなシグネチャを持つ関数のスライスを効率的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。