4

reflect.TypeGo でインターフェイスのを取得するよりも良い方法はありますreflect.TypeOf((*someInterface)(nil)).Elem()か?

機能しますが、スクロールするたびにうんざりします。

4

1 に答える 1

3

残念ながら、ありません。見苦しく見えるかもしれませんが、実際には、必要な情報を取得するために必要な最小限の情報を表現してreflect.Typeいます。これらは通常、必要なすべてのタイプを含むブロックのファイルの先頭に含まれているため、プログラムの初期化時に計算され、関数が値を必要とするたびに検索ペナルティvar()が発生しません。TypeOf

このイディオムは、標準ライブラリ全体で使用されます。たとえば、次のようになります。

html/template/content.go: errorType = reflect.TypeOf((*error)(nil)).Elem()

この冗長な構造の理由reflect.TypeOfは、組み込みではなくライブラリの一部であり、したがって実際には値を取る必要があるという事実に由来します。

一部の言語では、型の名前は式として使用できる識別子です。これは Go では当てはまりません。有効な式は仕様にあります。型の名前が としても使用できる場合、独自のメソッドがあるため (実際にはインターフェイスであるreflect.Typeため)、メソッド式があいまいになります。reflect.Typeまた、言語仕様を標準ライブラリと結合することになり、両方の柔軟性が低下します。

于 2013-01-05T14:06:04.567 に答える