最常用可靠的方式是用 reflect.TypeOf() 获取类型信息后通过 Kind() 判断底层类别:t.Kind() == reflect.String 判断字符串,t.Kind() == reflect.Ptr 判断指针,t.Kind() == reflect.Slice 判断切片;需区分自定义类型时结合 Name() 和 PkgPath() 精确匹配。

直接用 reflect.TypeOf() 获取类型信息,再通过比较 reflect.Type 或类型名做判断,是最常用也最可靠的方式。
用 reflect.TypeOf() 获取基础类型
传入变量(注意要传值或指针,不能传 nil 接口),返回 reflect.Type 对象:
-
v := 42; t := reflect.TypeOf(v)→ 得到int类型 -
s := "hello"; t := reflect.TypeOf(s)→ 得到string类型 -
var p *int; t := reflect.TypeOf(p)→ 得到*int类型
判断是否为某具体类型(推荐用 Kind)
Kind() 返回底层基本类别(如 reflect.Int, reflect.String, reflect.Struct 等),比 Name() 更稳定,尤其对自定义类型或指针有效:
-
t.Kind() == reflect.String→ 判断是否为字符串(含type MyStr string) -
t.Kind() == reflect.Ptr→ 判断是否为任意指针 -
t.Kind() == reflect.Slice→ 判断是否为切片([]int,[]string都匹配)
区分自定义类型和内置类型(用 Name() + PkgPath())
如果需要精确识别自定义类型(比如 type UserID int),可结合 Name() 和 PkgPath():
立即学习“go语言免费学习笔记(深入)”;
-
t.Name() != "" && t.PkgPath() != ""→ 表示是命名的自定义类型(非内置) -
t.Name() == "UserID" && t.PkgPath() == "myapp/models"→ 精确匹配某个类型 - 注意:
reflect.TypeOf(int(0)).Name()是空字符串,而reflect.TypeOf(UserID(0)).Name()是"UserID"
安全判断接口变量的实际类型
对接口类型(如 interface{})做类型检测时,先确认非 nil,再反射:
if v := reflect.ValueOf(i); v.IsValid() && v.Kind() != reflect.Invalid- 避免对 nil 接口调用
reflect.TypeOf(nil)→ 返回nil,直接判空即可 - 常见写法:
if i != nil { t := reflect.TypeOf(i).Elem() }(若 i 是指针接口)
基本上就这些。不复杂但容易忽略 Kind 和 Name 的区别,日常用 Kind 做通用判断,用 Name+PkgPath 做精确识别。










