如何使用Golang反射判断变量类型_Golang reflect类型检测实用说明

最常用可靠的方式是用 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()

  • 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 做精确识别。