Golang反射如何判断是否为struct_Golang类型检测方法
技术百科
P粉602998670
发布时间:2026-01-27
浏览: 次 最可靠方式是用 t.Kind() == reflect.Struct 判断结构体,需先处理指针解引用和 nil 值;Name() 不能用于判断是否为结构体,仅表示类型名称。
直接用 t.Kind() == reflect.Struct 判断是否为结构体
这是最可靠、最常用的方式。Go 的 reflect.Type.Kind() 返回的是底层类型类别,reflect.Struct 就代表“它是一个结构体”,不关心是不是自定义命名、有没有字段、是否为空结构体(如 struct{}),只要语法上是 struct 类型,就返回 Struct。
-
reflect.TypeOf(Person{}).Kind()→reflect.Struct -
reflect.TypeOf(struct{X int}{}).Kind()→ 同样是reflect.Struct,哪怕没名字 -
reflect.TypeOf(&Person{}).Kind()→ 是reflect.Ptr,不是Struct,这点必须注意
传入指针时要先调用 Elem() 解引用
很多实际场景中你拿到的是结构体指针(比如函数参数是 *User 或接口里存了 *Config),直接对指针调 Kind() 会得到 Ptr,误判为“不是结构体”。必须先判断是否为指针,再用 t.Elem() 获取它指向的类型。

- 错误写法:
reflect.TypeOf(&User{}).Kind() == reflect.Struct→false - 正确写法:
t := reflect.TypeOf(&User{}); if t.Kind() == reflect.Ptr { t = t.Elem() }; return t.Kind() == reflect.Struct - 别忘了:如果传进来的是
nil指针(如var u *User),t.Elem()不会 panic,但t本身是nil,调t.Kind()会 panic —— 所以安全起见,先判t != nil
别用 Name() 判断是否为 struct
t.Name() 只对**包内定义的导出命名类型**返回非空字符串,比如 type User struct{} 会返回 "User";但对匿名结构体(struct{})、未导出类型(type user struct{})或内建类型(int、[]string)都返回空字符串。它根本不是用来判断“是不是结构体”的,而是用来识别“叫什么名字”。
-
reflect.TypeOf(struct{X int}{}).Name()→"",但它确实是 struct -
reflect.TypeOf([]int{}).Name()→"",但它不是 struct,是 slice - 混淆
Name()和Kind()是新手最常见的反射误用之一
接口值传入前务必检查是否为 nil
如果你的函数接收的是 interface{},而调用方传了 nil(比如 var x interface{} 直接传进去),reflect.TypeOf(x) 会返回 nil,紧接着调 .Kind() 或 .Name() 就 panic。
- 安全做法:先用
if x == nil判断,或改用reflect.ValueOf(x),它对nil接口返回一个IsValid() == false的reflect.Value,可安全调.Kind()(返回Invalid) - 更稳妥的通用判断函数长这样:
func isStruct(v interface{}) bool { val := reflect.ValueOf(v) if !val.IsValid() { return false } t := val.Type() if t.Kind() == reflect.Ptr { t = t.Elem() } return t.Kind() == reflect.Struct }
真正容易被忽略的,是 nil 接口和指针解引用这两层边界 —— 它们不会报编译错误,但一跑就 panic,而且往往在边缘 case(比如测试传空、ORM 读不到数据)才暴露。
# 的是
# 这是
# 它是
# 但它
# 自定义
# 判断是否
# 再用
# go
# golang
# String
# if
# int
# 指针
# 字符串
# 接口
# nil
# typeof
# Interface
# var
# 结构体
# Struct
# 空字符串
# 会报
# 编译错误
# kind
# 最可靠
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Windows10系统怎么查看IP地址_Win10
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- Win11开始菜单打不开_修复Windows 11
- Win11怎么查看激活状态_查询Windows 1
- c++协程和线程的区别 c++异步编程模型对比【核
- Python对象比较与排序_魔术方法解析【教程】
- Win11应用商店下载慢怎么办 Win11更改DN
- LINUX如何开放防火墙端口_Linux fire
- Go 中的 := 运算符:类型推导机制与使用边界详
- php和redis连接超时怎么办_phpredis
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何在Golang中处理二进制数据_Golang
- Win11怎样安装网易云音乐_Win11安装网易云
- 如何高效识别并拦截拼接式恶意域名 spam
- 如何在Golang中捕获JSON序列化错误_Gol
- Windows系统文件被保护机制阻止怎么办_权限不
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- Go语言中CookieJar的持久化机制解析:内存
- Win11怎么设置鼠标宏_Win11鼠标按键自定义
- Windows怎样关闭Edge新标签页广告_Win
- php中self::能调用子类重写的方法吗_静态绑
- Windows10系统怎么查看设备管理器_Win1
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Windows 11如何查看系统激活密钥_Wind
- c++如何连接Redis c++ hiredis库
- Win10如何关闭安全中心所有通知 Win10禁用
- mac怎么右键_MAC鼠标右键设置与触控板手势技巧
- Win10系统怎么查看端口状态_Windows10
- Python与OpenAI接口集成实战_生成式AI
- Win11怎么开启远程桌面_Win11系统远程桌面
- Win10如何优化内存使用_Win10内存优化技巧
- Win11怎么开启远程桌面连接_Windows11
- 如何使用Golang encoding/json解
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Windows 11无法安全删除U盘提示设备正在使
- Win11怎么设置触控板手势_Windows11三
- php修改数据怎么改富文本_update更新htm
- 如何在Golang中处理数据库事务错误_回滚和日志
- Python对象比较排序规则_集合使用说明【指导】
- 如何在Golang中优化文件读写性能_使用缓冲和并
- 如何在Golang中实现RPC异步返回_Golan
- 如何用::实现工具类方法调用_php静态工具类设计
- c++如何实现一个高性能的环形队列(Ring Bu
- 如何使用Golang写入二进制文件_Golang
- Win10电脑怎么设置网络名称_Windows10
- php怎么下载安装后无法解析php文件_服务器配置
- 如何使用Golang搭建Web开发环境_快速启动H
- 如何使用Golang捕获并记录协程panic_保证
- Win11怎么设置夜间模式_Windows11显示
- php中作用域操作符能访问私有静态属性吗_访问权限

QQ客服