web-dev-qa-db-ja.com

golangでは、type自体から、name as stringからreflect.Typeを取得することは可能ですか?

type t1 struct { i int; s string }
var v1 reflect.Type = /* how to set to t1's reflect.Type? */
  1. インスタンス化せずにreflect.Typeのt1を取得することは可能ですか?

  2. 文字列として「t1」という名前を持つことからt1のreflect.Typeを取得することは可能ですか?

30
cc young

1の場合、はい、ちょっと:

var v1 reflect.Type = reflect.TypeOf((*t1)(nil)).Elem()
fmt.Println(v1)  // prints "main.t1"

インスタンス化は必要ありません。ただし、Goには型リテラルがありません。これは、あなたが求めているものだと思います。型の実行時値を取得するには、ある種の値が必要です。実行時に値を作成したくない、または作成できない場合は、型指定されたnilから値をプルできます。これを毎回検索するというアイデアが気に入らない場合は、このランタイムタイプを変数に格納できます。

2では、いいえ、そうではありません。これには、Goランタイムが現在のバイナリのすべてのタイプのマップを維持する必要がありますが、これには多くの問題があります。あなたcouldタイプレジストリパッケージを作成し、文字列で取得したいすべてのタイプを登録しますが、それは常に不完全であり、必要なタイプがわかっている場合は、いつでもTypeOfを使用できます。 。匿名タイプを使用できるため、状況は少し複雑になります。また、別のパッケージが同じ名前のタイプを持っている可能性があるため、「t1」のような名前が一意であるかどうかは定かではありません。 Goランタイムが文字列名から型を与える関数を提供することは可能ですが、そうなるとは思えません。

47
Kyle C