ホームページ > バックエンド開発 > Golang > 型名のみを文字列として使用して Go インスタンスを作成するにはどうすればよいですか?

型名のみを文字列として使用して Go インスタンスを作成するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-24 21:43:11
オリジナル
827 人が閲覧しました

How Can I Create Go Instances Using Only Their Type Names as Strings?

Go で型名からインスタンスを作成する

Go では、型名のみが文字列として利用可能な場合にオブジェクトをインスタンス化するのは簡単ではありません。これは、Go が静的に型指定され、リンク中に未使用のコードが削除されるためです。

リフレクションの使用

制約にもかかわらず、リフレクションを使用してインスタンスを動的に作成できます。プロセスは次のとおりです。

  1. グローバル マップ[文字列]reflect.Type を設定して、型名を対応するリフレクションに関連付けます。これは、パッケージの初期化関数で実行できます。
  2. オブジェクトをインスタンス化するには、マップ内でその Reflect.Type を検索します。
  3. 新しいインスタンスへのポインターを取得するには、reflect.New を使用します。
  4. interface{} タイプと Elem().Interface() を使用してオブジェクトを抽出します。これにより、ポインタの参照が解除され、インターフェースに変換されます。 value.

コード例:

import (
    "fmt"
    "reflect"
)

// Global map for type lookup
var typeMap = make(map[string]reflect.Type)

func init() {
    // Initialize typeMap by adding types to it
    typeMap["MyStruct"] = reflect.TypeOf(MyStruct{})
}

func main() {
    typeName := "MyStruct"
    t := typeMap[typeName]
    instance := reflect.New(t).Elem().Interface()
    fmt.Println(instance)
}
ログイン後にコピー

代替アプローチ

反省とは別に、次のことを考慮してください。代替案:

  • ファクトリ メソッド: 各タイプのファクトリ関数を定義すると、作成とオブジェクトの作成が容易になります。
  • 作成関数のマップ: map[string]func() インターフェースを維持します{}。キーは型名、値は新しい値を返す関数です。

注: これらのアプローチにより、リフレクションの複雑さが回避され、コンパイル中のエラー処理が向上する可能性があります。

以上が型名のみを文字列として使用して Go インスタンスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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