Go で異なるシグネチャを持つ関数のスライスを作成するにはどうすればよいですか?
Go の型システムは静的に型付けされています。これは、関数がコンパイル時に固定シグネチャを持つ必要があることを意味します。ただし、さまざまな型や数値の引数を受け入れることができる関数のスライスを作成すると便利です。
提供されたコードは機能しますが、各引数を処理するには switch ステートメントを使用する必要があります。関数シグネチャのタイプ。より簡潔で柔軟な解決策は、リフレクションを使用することです。
次に例を示します:
package main import ( "fmt" "reflect" ) type Executor func(...interface{}) func main() { functions := []Executor{ func(a, b int) { fmt.Println(a + b) }, func(s string) { fmt.Println(s) }, func() { fmt.Println("No arguments") }, } for _, f := range functions { numIn := reflect.TypeOf(f).NumIn() args := make([]reflect.Value, numIn) for i := 0; i < numIn; i++ { switch reflect.TypeOf(f).In(i).Kind() { case reflect.Int: args[i] = reflect.ValueOf(12) case reflect.String: args[i] = reflect.ValueOf("Hello") default: args[i] = reflect.Value{} } } f.Call(args) } }
この解決策では、Executor 関数のスライスを作成します。これは、任意の数の関数を受け入れる関数です。引数。リフレクト パッケージは、各関数で予期される引数の数と型を決定し、対応するreflect.Value スライスを生成するために使用されます。
リフレクションを使用すると、型スイッチを必要とせずに、さまざまなシグネチャを持つ関数を動的に呼び出すことができます。またはインターフェイスのスライス。
以上がGo で異なるシグネチャを持つ関数のスライスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。