Reflection Go中的反射类型和值

Reflection Go中的反射类型和值,reflection,go,Reflection,Go,我不太清楚这个代码片段的行为 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().Fie

我不太清楚这个代码片段的行为

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() 
    }
}
反射中的类型和值之间有什么区别?

reflect.TypeOf()
返回一个值,而
reflect.ValueOf()返回一个值。
reflect.Type
允许您查询绑定到具有相同类型的所有变量的信息,而
reflect.Value
允许您查询信息并对任意类型的数据执行操作

在上面的示例中,您使用
reflect.Type
获取Person结构中第一个字段的“标记”。您可以从
*Person
的类型开始。要获取
Person
的类型信息,请使用
t.Elem()
。然后使用
.field(0).tag
提取第一个字段的标记信息。您传递的实际值,
i
,并不重要,因为第一个字段的标记是类型的一部分

您使用
reflect.Value
获取值
i
的第一个字段的字符串表示形式。首先,您使用
v.Elem()
获取由
i
指向的结构的值,然后访问第一个字段的数据(
.Field(0)
),最后将该数据转换为字符串(
.string()
)。

您还应该阅读以了解有关反射的更多详细信息。