7

このコードスニペットがどのように動作するかについてはよくわかりません。

func show(i interface{}) {
    switch t := i.(type) {
    case *Person:
      t := reflect.TypeOf(i)  //what t contains?   
      v := reflect.ValueOf(i)  //what v contains?
      tag := t.Elem().Field(0).Tag
      name := v.Elem().Field(0).String() 
    }
}

リフレクションのタイプと値の違いは何ですか?

4

1 に答える 1

8

reflect.TypeOf()Reflect.Typeを返し、reflect.Valuereflect.ValueOf()を返します。Aを使用すると、同じタイプのすべての変数に関連付けられている情報をクエリできます。また、任意のタイプのデータに対して情報をクエリし、操作を実行できます。reflect.Typereflect.Value

上記の例では、を使用してreflect.Type、Person構造体の最初のフィールドの「タグ」を取得しています。Typeforから始め*Personます。のタイプ情報を取得するにはPerson、を使用しt.Elem()ました。次に、を使用して最初のフィールドに関するタグ情報を取得しました.Field(0).Tag。最初のフィールドのタグはタイプの一部であるため、渡した実際の値iは重要ではありません。

以前reflect.Valueは、値の最初のフィールドの文字列表現を取得していましたi。最初にv.Elem()、が指す構造体の値を取得しi、次に最初のフィールドのデータ(.Field(0))にアクセスし、最後にそのデータを文字列(.String())に変換していました。

于 2012-10-29T05:15:13.477 に答える