reflect.typeof() 返回静态类型,name() 对非导出类型返回空,kind() 才是稳定分类依据;传值、传指针、传接口各影响结果;elem() 仅对 ptr/slice/map/chan/array 有效;结构体反射需先判 kind() == struct。

直接用 reflect.TypeOf() 拿到 reflect.Type,但别只盯着 Name() 看——它对 int、[]string、匿名结构体一律返回空字符串,真正稳定可用的是 Kind() 和 String()。
传值还是传指针?reflect.TypeOf() 的参数陷阱
你传什么,它就返回什么的类型,不猜、不推、不转换:
- 传
v(值)→ 返回v的静态类型,如reflect.TypeOf(42)得int - 传
&v(地址)→ 返回*T类型,如reflect.TypeOf(&42)得*int,不是int - 传
interface{}变量 → 返回其底层具体类型,不是interface{}本身 - 传
nil接口(如var x interface{}未赋值)→ 直接 panic,必须先判空
Kind() 是唯一靠谱的类型分类依据
Name() 只对导出的具名类型(如 type User struct{})返回 "User";对内置类型、切片、映射、指针、匿名结构体都返回空。而 Kind() 始终返回底层分类枚举值,稳定且可分支判断:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
-
reflect.TypeOf("hello").Kind()→reflect.String -
reflect.TypeOf([]int{}).Kind()→reflect.Slice -
reflect.TypeOf(&x).Kind()→reflect.Ptr(不是reflect.Int!要先.Elem()) -
type MyInt int; reflect.TypeOf(MyInt(0)).Kind()→reflect.Int(不是MyInt)
解析结构体字段时,必须先过 Kind() == reflect.Struct 这关
调用 NumField() 或 Field(i) 前不检查类型,运行时直接 panic:
- 先写
if t.Kind() == reflect.Struct,再调t.NumField() -
t.Field(i)返回StructField,其中Type是字段自身的reflect.Type,可递归处理 - 不可导出字段(小写开头)在反射中完全不可见,
NumField()不计数,FieldByName()查不到 - 想读标签(如
`json:"name"`),用sf.Tag.Get("json"),不是sf.Tag原始字符串
Elem() 用错会 panic,只对特定 Kind 有效
Elem() 不是万能解引用:它只对 reflect.Ptr、reflect.Slice、reflect.Map、reflect.Chan、reflect.Array 有效。对 reflect.Struct 或 reflect.Int 调用会立即崩溃:
-
reflect.TypeOf(&x).Elem()→int(安全) -
reflect.TypeOf([]byte{}).Elem()→uint8(安全) -
reflect.TypeOf(x).Elem()(x是int)→ panic - 不确定时,先用
t.Kind()判断:只有reflect.Ptr等五种才可调Elem()
最易被忽略的点:reflect.TypeOf() 返回的是静态编译类型,不是运行时动态值的“语义类型”;比如 var v interface{} = int64(1),reflect.TypeOf(v) 是 int64,但如果你本意是泛化处理所有数字,就得靠 Kind() 归类,而不是依赖 Name() 匹配字符串。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










