Go で型文字列を使用して構造体メソッドを動的に呼び出すことはできますか?

Mary-Kate Olsen
リリース: 2024-11-16 18:45:03
オリジナル
551 人が閲覧しました

Can You Dynamically Invoke Struct Methods in Go Using Type Strings?

リフレクション: 文字列識別子を使用して構造体メソッドを動的に呼び出す

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート