我不是很清楚这个代码片段的行为。
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.Type reflect.ValueOf()
返回 reflect.Value . reflect.Type
允许您查询绑定(bind)到具有相同类型的所有变量的信息,而 reflect.Value
允许您查询信息并对任意数据执行操作类型。
此外,reflect.ValueOf(i).Type()
等同于 reflect.TypeOf(i)
。
在上面的示例中,您使用 reflect.Type
获取 Person 结构中第一个字段的“标签”。您从 *Person
的类型开始。要获取 Person
的类型信息,您使用了 t.Elem()
。然后,您使用 .Field(0).Tag
提取了第一个字段的标签信息。您传递的实际值 i
并不重要,因为第一个字段的 Tag 是类型的一部分。
您使用 reflect.Value
获取值 i
的第一个字段的字符串表示形式。首先,您使用 v.Elem()
为 i
指向的结构获取一个值,然后访问第一个 Field 的数据 (.Field(0)
),最后将该数据转换为字符串 (.String()
)。
关于Go 中的反射类型和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115677/