リフレクトを使用して、構造体フィールドのタイプがインターフェースかどうかを確認するにはどうすればよいですか?

F21:

私は構造体フィールドのタイプを決定するために反射パッケージを使用しています interface{}

私はそのように比較したいです(はtですreflect.Type):

if  t == reflect.TypeOf(interface{}) {

}

問題は、コンパイラが文句を言うことですtype interface {} is not an expression

とにかく、構造体フィールドのタイプがinterface{}

icza:

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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ