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; ?>
】
相关推荐
- c++ stringstream用法详解_c++字
- Win11怎么更改任务栏颜色_Windows11个
- Go 语言标准库为何不提供泛型切片的 Contai
- 为什么本地php环境运行php脚本卡顿_php执行
- Win10怎么创建桌面快捷方式 Win10为应用创
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- Win11怎么开启剪贴板历史记录_Windows1
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- 如何处理“XML格式不正确”错误 常见XML we
- Go 中的 := 运算符:类型推导机制与使用边界详
- XAMPP 启动失败(Apache 突然停止)的终
- Win11怎么开启远程桌面_Win11系统远程桌面
- Win11怎么更改任务栏位置_修改注册表将Win1
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Windows10如何更改鼠标图标_Win10鼠标
- c# await 一个已经完成的Task会发生什么
- Win11怎么关闭内容自适应亮度_Windows1
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11怎么退出高对比度模式_Win11取消反色
- 如何使用Golang开发简单的聊天室消息存储_Go
- LINUX如何删除用户和用户组_Linux use
- Win10系统怎么查看显卡温度_Win10任务管理
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- Mac如何备份到iCloud_Mac桌面与文稿文件
- Windows蓝屏错误0x00000023怎么修复
- Win10系统怎么查看网络连接状态_Windows
- ACF 教程:正确更新嵌套在多层 Group 字段
- Win11无法识别耳机怎么办_解决Win11插耳机
- Go 中实现 Python urllib.quot
- Windows10如何查看蓝屏日志_Win10使用
- Linux如何安装Tomcat应用服务器_Linu
- Win11声音忽大忽小怎么办 Win11音频增强功
- Win11怎么清理C盘下载文件夹_Win11清理下
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- php中常量能用::访问吗_类常量与作用域操作符使
- php能跑在stm32上吗_php在stm32微控
- Windows10系统怎么查看显卡型号_Win10
- Go 中 defer 语句在 goroutine
- Python脚本参数接收_sys与argparse
- Win11如何添加/删除输入法 Win11切换中英
- Windows11怎么用“记事本”自动换行与编码
- php8.4如何调用com组件_php8.4win
- Win11怎么开启窗口对齐助手_Windows11
- Go 中 defer 在 goroutine 内部
- php能控制zigbee模块吗_php通过串口与c
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Windows如何拦截2345弹窗广告_Windo
- 如何解决Windows时间不准的问题?(自动同步设
- php8.4xdebug无法调试怎么办_php8.

QQ客服