reflect.TypeOf() 获取变量动态类型,返回 reflect.Type 对象;t.Kind() 返回底层类别更可靠,t.Name() 对匿名或内建类型返回空字符串;需区分 Type(类型)与 Value(值)用途。
在 Go 中,reflect 包是查看和操作变量运行时类型与值的核心工具。要获取变量的类型信息,关键不是看它的声明类型,而是用 reflect.TypeOf() 拿到其动态类型描述。
reflect.TypeOf() 接收任意接口值,返回一个 reflect.Type 类型的对象,它包含了完整的类型元数据,比如名称、包路径、是否为指针、是否实现了某个接口等。
&v,得到的是指向它的指针类型reflect.TypeOf(nil) 返回
nil,需先判空int、string)和自定义类型都能正确识别,包括结构体字段名和标签reflect.Type 提供了多个方法来解析类型细节:
t.Name():返回类型的名称(对匿名类型或内建类型返回空字符串)t.Kind():返回底层类型类别,如 reflect.Struct、reflect.Ptr、reflect.Slice 等,比 Name() 更可靠t.PkgPath():返回定义该类型的包路径(未导出类型会返回非空字符串,导出类型可能为空)t.String():返回类似 "main.User" 或 "[]int" 的可读字符串表示初学者容易混淆 reflect.TypeOf() 和 reflect.ValueOf():
reflect.TypeOf(x) 关注“它是什么类型”,不关心值内容reflect.ValueOf(x) 关注“它的值是多少”,同时携带类型信息(可通过 .Type() 反查)reflect.TypeOf(),而不是对其内部值做假设下面是一个小工具函数,能清晰展示变量的种类、名称和完整字符串表示:
func printType(v interface{}) {