ホームページ >バックエンド開発 >Golang >Go のリフレクションは、事前定義されたインターフェイスを実装する関数を作成できますか?

Go のリフレクションは、事前定義されたインターフェイスを実装する関数を作成できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-11 18:18:12969ブラウズ

Can Go's Reflection Create Functions Implementing Predefined Interfaces?

Go のリフレクション機能の拡張

質問:

定義済みインターフェースを実装する関数を動的に作成することは可能ですか?使用してくださいリフレクション?

答え:

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。