我不太清楚这段代码片段的行为.
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()
}
}
Run Code Online (Sandbox Code Playgroud)
反射中的类型和值有什么区别?
reflect.TypeOf()返回一个reflect.Type并reflect.ValueOf()返回一个reflect.Value.A reflect.Type允许您查询与所有具有相同类型的变量关联的信息,同时reflect.Value允许您查询信息并对任意类型的数据执行预处理操作.
在上面的示例中,您使用了reflect.Type获取Person结构中第一个字段的"标记".你从Type for开始*Person.要获取Person您使用的类型信息t.Elem().然后,您使用了第一个字段的标记信息.Field(0).Tag.您传递的实际值i无关紧要,因为第一个字段的Tag是该类型的一部分.
您曾经reflect.Value获得过值的第一个字段的字符串表示i.首先,您曾经v.Elem()获取指向的struct的Value i,然后访问第一个Field的data(.Field(0)),最后将该数据转换为string(.String()).