リフレクション: 文字列識別子を使用して構造体メソッドを動的に呼び出す
Go では、リフレクションを使用すると、実行時に型と値を検査および操作できます。リフレクションを使用すると、文字列識別子を使用して構造体メソッドを動的に呼び出すことができます。ただし、インスタンスを明示的に作成するのではなく、構造体型の文字列表現を使用してメソッドを呼び出したい場合はどうすればよいでしょうか?
提供されている元のコード スニペットはこれを実行しようとしますが、reflect.TypeOf() が原因で失敗します。文字列型ではなく値を期待します。受け入れられた回答は、型名をコード内のどこかの文字列に一致させ、型名と構造体の間のマッピングを効果的にハードコーディングすることを提案しています。
残念ながら、Go のリフレクション パッケージには、この目的のための組み込みメカニズムが提供されていません。目的を達成するには、独自のタイプ レジストリを作成する必要があります。その方法は次のとおりです。
package main import ( "fmt" "reflect" ) // Create a type registry to map type names to types var typeRegistry = make(map[string]reflect.Type) type MyStruct struct { } func (a *MyStruct) AAction() { fmt.Println("Hello a") } // Register the MyStruct type in the registry func init() { typeRegistry["MyStruct"] = reflect.TypeOf(MyStruct{}) } func main() { // Get the Type object for the struct from the registry structType := typeRegistry["MyStruct"] // Dynamically invoke the method using reflection reflect.New(structType).MethodByName("AAction").Call([]reflect.Value{}) }
レジストリに型を登録することで、構造体の文字列名を使用してレジストリからreflect.Type オブジェクトを動的に取得できるようになります。これにより、構造体のインスタンスを明示的に作成しなくても、構造体メソッドを動的に呼び出すことができます。
要約すると、Go リフレクション パッケージは型文字列を使用した構造体メソッドの呼び出しを直接サポートしていませんが、実現することは可能です。この機能は、型名を型にマップする独自の型レジストリを維持することによって実現されます。このアプローチにより柔軟性がもたらされ、コード内のマッピングをハードコーディングする必要がなくなりました。
以上がGo で型文字列を使用して構造体メソッドを動的に呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。