reflect.TypeOf() 获取变量动态类型,返回 reflect.Type 对象;t.Kind() 返回底层类别更可靠,t.Name() 对匿名或内建类型返回空字符串;需区分 Type(类型)与 Value(值)用途。

在 Go 中,reflect 包是查看和操作变量运行时类型与值的核心工具。要获取变量的类型信息,关键不是看它的声明类型,而是用 reflect.TypeOf() 拿到其动态类型描述。
用 reflect.TypeOf() 获取类型对象
reflect.TypeOf() 接收任意接口值,返回一个 reflect.Type 类型的对象,它包含了完整的类型元数据,比如名称、包路径、是否为指针、是否实现了某个接口等。
- 传入变量本身(非指针),得到的是该值的类型;传入
&v,得到的是指向它的指针类型 - 如果变量是 nil 接口,
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"的可读字符串表示
区分 Type 和 Value 的常见误区
初学者容易混淆 reflect.TypeOf() 和 reflect.ValueOf():
立即学习“go语言免费学习笔记(深入)”;
-
reflect.TypeOf(x)关注“它是什么类型”,不关心值内容 -
reflect.ValueOf(x)关注“它的值是多少”,同时携带类型信息(可通过.Type()反查) - 若想检查接口变量实际装了什么类型,必须对接口本身调用
reflect.TypeOf(),而不是对其内部值做假设
实际例子:打印任意变量的类型详情
下面是一个小工具函数,能清晰展示变量的种类、名称和完整字符串表示:
func printType(v interface{}) {t := reflect.TypeOf(v)
if t == nil {
fmt.Println("type: nil")
return
}
fmt.Printf("type: %s, kind: %s, name: %q, pkg: %q\n",
t.String(), t.Kind(), t.Name(), t.PkgPath())
}










