Go 中判断指针类型需用 reflect.TypeOf(v).Kind() == reflect.Ptr;须先获取类型再调用 Kind,且需防范 nil 接口导致 panic,推荐使用带 nil 检查的 IsPtr 辅助函数。

在 Go 中,可以通过 reflect.Kind 判断一个值是否为指针类型,核心是使用 reflect.TypeOf(v).Kind() == reflect.Ptr。
获取 Kind 前需先取类型
reflect.Kind 描述的是类型的底层类别(如 Ptr、Struct、Int 等),它不直接作用于值本身,而是作用于其类型。因此必须先用 reflect.TypeOf 获取类型对象,再调用 .Kind():
- 对变量
v,写法是reflect.TypeOf(v).Kind() == reflect.Ptr - 注意:不能对
nil接口直接调用reflect.TypeOf,否则返回nil,会 panic;应确保传入非 nil 的接口值,或先做空值判断
区分 Ptr 和 Pointer 的常见误区
reflect.Ptr 表示该类型本身是指针类型(如 *int、*string),但不表示该值当前是否为 nil:
-
var p *int = nil→reflect.TypeOf(p).Kind()仍是reflect.Ptr -
var i int = 42; v := &i→ 同样是reflect.Ptr,且值非 nil - 若想同时检查是否为指针且非 nil,需额外用
reflect.ValueOf(v).IsValid() && !reflect.ValueOf(v).IsNil()
处理 interface{} 类型时要小心
当函数接收 interface{} 参数时,传入的可能是任意类型,包括 nil 接口本身:
立即学习“go语言免费学习笔记(深入)”;
-
var x interface{} = (*int)(nil):此时reflect.TypeOf(x)返回*int,.Kind()是Ptr -
var x interface{}(未赋值):此时reflect.TypeOf(x)返回nil,直接调用.Kind()会 panic - 安全做法是先判断
reflect.TypeOf(v) != nil,再取.Kind()
实用小函数示例
封装一个安全判断是否为指针类型的辅助函数:
// IsPtr reports whether v is a pointer type (e.g. *T), regardless of its value.
func IsPtr(v interface{}) bool {
t := reflect.TypeOf(v)
if t == nil {
return false
}
return t.Kind() == reflect.Ptr
}
该函数能正确处理普通变量、指针变量、nil 指针,以及 nil 接口(返回 false),适合通用场景。










