私は構造体フィールドのタイプを決定するために反射パッケージを使用しています interface{}
私はそのように比較したいです(はt
ですreflect.Type
):
if t == reflect.TypeOf(interface{}) {
}
問題は、コンパイラが文句を言うことですtype interface {} is not an expression
。
とにかく、構造体フィールドのタイプがinterface{}
?
interface{}
型でありreflect.TypeOf()
、値が必要です。したがって、リテラルinterface{}
を渡すことはできません。値のみを渡すことができます。
元の質問に戻ります。struct
例を見てみましょう:
type My struct {
A int
B interface{}
C io.Reader
}
フィールドのタイプがであるかどうかを確認したいとしますinterface{}
。タイプのを取得するreflect.Type
と、またはstruct
を使用してフィールドにアクセスできます。Type.Field()
Type.FieldByName()
これによりreflect.StructField
、フィールドのタイプを格納するタイプの値が得られます。
ここまでは順調ですね。しかし、それを何と比較する必要がありますか?interface{}
メソッドが0のインターフェースタイプです。その型の値を持つ(インスタンス化する)ことはできません。具象型の値しか持てませんが、そうです、それらはインターフェース型にラップされているかもしれません。
を使用Type.Kind
してそれをと比較するとreflect.Interface
、それがインターフェイスかどうかがわかりますが、これはtrue
すべてのインターフェイスタイプに当てはまります。で0のメソッドがあるかどうかを確認することもできます。これはの0 Type.NumMethod()
でなければなりませんがinterface{}
、他のインターフェースも0のメソッドを持つ可能性があります...
を使用することもできますType.Name
が、interface{}
は名前のない型なので、その名前は空の文字列です""
(他にも名前のない型があります)。あなたは空のインターフェースに対してType.String()
どれを返すかを使うかもしれません"interface {}"
:
t := reflect.TypeOf(My{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field %q, type: %-12v, type name: %-8q, is interface{}: %v\n",
f.Name, f.Type,
f.Type.Name(),
f.Type.String() == "interface {}",
)
}
出力(Go Playgroundで試してください):
Field "A", type: int , type name: "int" , is interface{}: false
Field "B", type: interface {}, type name: "" , is interface{}: true
Field "C", type: io.Reader , type name: "Reader", is interface{}: false
この関連する質問は興味深い/役に立つかもしれません:リフレクトを使用して非組み込み型を識別する
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加