あなたはreflect.Type
型記述子を取得するためにreflect.TypeOf()
機能を使用することができます。そこから、インターフェイスに格納されている動的値のフィールドを一覧表示できます。
例:
type Point struct {
X int
Y int
}
var reply interface{} = Point{1, 2}
t := reflect.TypeOf(reply)
for i := 0; i < t.NumField(); i++ {
fmt.Printf("%+v\n", t.Field(i))
}
出力:
:
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false}
{Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}
Type.Field()
呼び出しの結果は、とりわけ、フィールドの名前を含む、struct
あるreflect.StructField
値であり、
type StructField struct {
// Name is the field name.
Name string
// ...
}
値フィールドで、あなたはreflect.Value()
を取得するためにreflect.ValueOf()
を使用することができ、その後、あなたがValue.Field()
かValue.FieldByName()
を使用することがあります。
v := reflect.ValueOf(reply)
for i := 0; i < v.NumField(); i++ {
fmt.Println(v.Field(i))
}
出力:
1
2
はGo Playground上でそれを試してみてください。
注:多くの場合、構造体へのポインタはインターフェイスにラップされます。このような場合、あなたは先の尖ったタイプまたは値に「移動」しType.Elem()
とValue.Elem()
を使用することがあります。
t := reflect.TypeOf(reply).Elem()
v := reflect.ValueOf(reply).Elem()
あなたはそれがポインタかのかどうかわからない場合、あなたは、比較、Type.Kind()
とValue.Kind()
でそれを確認することができますreflect.Ptr
と結果は:
t := reflect.TypeOf(reply)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
// ...
v := reflect.ValueOf(reply)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
Go Playgroundでこのバリアントを試してみてください。
Goの意見の詳細については、ブログ記事The Laws of Reflectionをご覧ください。
正確に私は答えたいと思っていました!余分なマイルのために働いて、働くコードを提供してくれてありがとう。 – RAFJR
ブログ記事を含む詳細な回答ありがとうございます。非常に役立ちます。 –