ホームページ  >  記事  >  バックエンド開発  >  リフレクションを通じて文字列名のみを使用して Go で構造体メソッドを呼び出すことはできますか?

リフレクションを通じて文字列名のみを使用して Go で構造体メソッドを呼び出すことはできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-24 00:47:10471ブラウズ

Can You Invoke a Struct Method in Go Using Only Its String Name Through Reflection?

リフレクション: 文字列による構造体へのアクセス

特定のメソッドを持つ構造体があるシナリオを考えてみましょう:

type MyStruct struct {
}

func (a *MyStruct) AAction() {
    fmt.Println("Hello a")
}

リフレクションを使用して AAction メソッドを動的に呼び出すには、次の操作を行うことができます (有効です) approach):

reflect.New(reflect.TypeOf(MyStruct{})).MethodByName("AAction").Call([]reflect.Value{})

ただし、MyStruct{} を式として使用することは、望ましいアプローチではありません。代わりに、構造体名を文字列として指定したいとします。このアプローチは現在アクセスできません:

theStruct := "MyStruct"
theAction := "AAction"
reflect.New(reflect.TypeOf(theStruct)).MethodByName(theAction).Call([]reflect.Value{})

残念ながら、reflect.TypeOf(theStruct) は型文字列になるため、この試みには欠陥があります。

調査によると、同様のエラーが発生しました。文字列を使用した名前による構造体メソッドの呼び出しに関する質問です。ただし、提案されている文字列マッチングのアプローチは実行可能な解決策ではありません。

答え:

あなたの願望にもかかわらず、呼び出すことは不可能

です。構造体名を表す文字列のみを使用する構造体メソッド。これは真実です。なぜなら、リフレクションが動作するには、問題の型の具体的な値が必要だからです。値がないと、構造体またはそのメソッドを操作する方法がありません。

目的の機能を実現するには、構造体名を対応する型にマップするカスタム レジストリを維持する必要があります。このレジストリを使用すると、文字列名に基づいて型を取得し、通常どおりリフレクションを使用できるようになります。ただし、このアプローチには追加の労力が必要であり、すべてのシナリオに適しているわけではありません。

以上がリフレクションを通じて文字列名のみを使用して Go で構造体メソッドを呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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