我不太清楚此代码段的行为。
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()
}
}
反射中的类型和值有什么区别?
答案 0 :(得分:6)
reflect.TypeOf()
返回reflect.Type,reflect.ValueOf()
返回reflect.Value。 reflect.Type
允许您查询与所有具有相同类型的变量相关联的信息,而reflect.Value
允许您查询信息并对任意类型的数据执行操作。
在上面的示例中,您使用reflect.Type
来获取Person结构中第一个字段的“标记”。您从*Person
的类型开始。要获取Person
的类型信息,请使用t.Elem()
。然后,您使用.Field(0).Tag
提取了有关第一个字段的标记信息。您传递的实际值i
无关紧要,因为第一个字段的标记是该类型的一部分。
您使用reflect.Value
获取值i
的第一个字段的字符串表示形式。首先,您使用v.Elem()
获取i
指向的结构的值,然后访问第一个Field的数据(.Field(0)
),最后将该数据转换为字符串({{1 }})。