質問:
定義済みインターフェースを実装する関数を動的に作成することは可能ですか?使用してくださいリフレクション?
答え:
Go の元のバージョンでは、リフレクションを介してアタッチされたメソッドを持つ新しい型を作成することはできませんでした。ただし、Go 1.5 のリリースでは、まさにこのニーズに対応するために、reflect.FuncOf 関数とreflect.MakeFunc 関数が導入されました。
これらの関数を使用すると、関数の型を定義し、それに準拠する関数値を作成できます。 type:
funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")}) fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
reflect.MakeFunc の最初の引数は関数の型で、2 番目の引数はそれを実装する関数の値です。 type.
指定された例のコンテキストでは:
type MyService interface { Login(username, password string) (sessionId int, err error) HelloWorld(sessionId int) (hi string, err error) }
次のようにリフレクションを使用してこのインターフェイスを実装する関数を作成できます:
fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value { switch args[0].String() { case "Login": return []reflect.Value{ reflect.ValueOf(1), reflect.ValueOf(nil), } case "HelloWorld": return []reflect.Value{ reflect.ValueOf("Hello, world!"), reflect.ValueOf(nil), } } return []reflect.Value{ reflect.Value{}, reflect.ValueOf(errors.New("Method not found")), } })
この実装switch ステートメントを使用して、最初の引数に基づいてインターフェイスのどのメソッドを呼び出すかを決定します。その後、出力引数に適切な値を返します。
以上がGo のリフレクションは、事前定義されたインターフェイスを実装する関数を作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。