Go中遍历结构体字段需用reflect包,仅支持导出字段:用reflect.TypeOf获取类型,NumField()和Field(i)遍历,field.Name、field.Type、field.Tag分别获取字段名、类型、标签;非导出字段被忽略。
在 Go 中遍历结构体字段并动态获取字段名和类型,需要借助 reflect 包。Go 的结构体本身不支持原生的运行时字段枚举,但通过反射可以安全、可控地读取公开字段(首字母大写的导出字段)的名称、类型、标签等信息。
先用 reflect.TypeOf 获取结构体的类型对象,再调用 .NumField() 和 .Field(i) 遍历每个字段:
field.N
ame:字段名(字符串,如 "Name")field.Type:字段的类型(reflect.Type),可进一步调用 .Name() 或 .Kind()
field.Tag:结构体标签(如 `json:"name"`),可用 Get("json") 提取注意:只能访问**导出字段**(首字母大写),未导出字段会被忽略且无法通过反射读取值(即使能拿到字段描述,field.Type 可访问,但 reflect.Value.Field(i) 会 panic)。
以下是一个典型用法:
package mainimport ( "fmt" "reflect" )
type User struct { Name string
json:"name"Age intjson:"age"Email stringjson:"email,omitempty"id int // 小写,非导出字段,不会出现在遍历中 }func printStructFields(v interface{}) { t := reflect.TypeOf(v) if t.Kind() == reflect.Ptr { t = t.Elem() } if t.Kind() != reflect.Struct { fmt.Println("不是结构体类型") return }
fmt.Printf("结构体 %s 字段列表:\n", t.Name()) for i := 0; i < t.NumField(); i++ { field := t.Field(i) typeName := field.Type.Name() if typeName == "" && field.Type.Kind() == reflect.Ptr { typeName = "*" + field.Type.Elem().Name() } jsonTag := field.Tag.Get("json") fmt.Printf("- %s: %s (JSON: %q)\n", field.Name, field.Type, jsonTag) }}
func main() { u := User{Name: "Alice", Age: 30} printStructFields(u) // 传值或传指针均可(函数内已处理) }
输出类似:
结构体 User 字段列表: - Name: string (JSON: "name") - Age: int (JSON: "age") - Email: string (JSON: "email,omitempty")获取字段值需配合 reflect.Value
仅获取字段名和类型用
reflect.TypeOf即可;若还需读取当前值,需用reflect.ValueOf,并确保值是可寻址的(如传指针或变量):
v := reflect.ValueOf(&u).Elem() 得到可读写的结构体值v.Field(i).Interface() 获取第 i 个字段的实际值(注意类型断言或 panic 风险)v.Field(i).CanInterface() 返回 false,不能安全取值field.Type.Kind() == reflect.Struct
field.Anonymous 为 true,可据此做特殊处理
# js
# json
# go
# golang
# ai
# 中间件
# 字符串
# 结构体
# 递归
# 循环
# 指针
# Struct
# Interface
# 对象
# typeof
# kind
# http
# 遍历
# 字段名
# 需用
# 首字母
# 是一个
# 也会
# 出现在
# 均可
# 不支持
相关文章:
如何快速搭建二级域名独立网站?
如何快速建站并高效导出源代码?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站之星伪静态规则如何正确配置?
网站设计制作企业有哪些,抖音官网主页怎么设置?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
,如何利用word制作宣传手册?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
全景视频制作网站有哪些,全景图怎么做成网页?
如何在香港免费服务器上快速搭建网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
seo网站制作优化,网站SEO优化步骤有哪些?
如何在阿里云虚拟主机上快速搭建个人网站?
c# 服务器GC和工作站GC的区别和设置
高端建站三要素:定制模板、企业官网与响应式设计优化
建站主机无法访问?如何排查域名与服务器问题
如何在橙子建站上传落地页?操作指南详解
如何在IIS中配置站点IP、端口及主机头?
网站制作软件有哪些,制图软件有哪些?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
如何通过VPS建站实现广告与增值服务盈利?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
黑客如何利用漏洞与弱口令入侵网站服务器?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
高端企业智能建站程序:SEO优化与响应式模板定制开发
建站之星安装后如何配置SEO及设计样式?
如何将凡科建站内容保存为本地文件?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
怎么将XML数据可视化 D3.js加载XML
教程网站设计制作软件,怎么创建自己的一个网站?
,柠檬视频怎样兑换vip?
Swift中switch语句区间和元组模式匹配
如何在云虚拟主机上快速搭建个人网站?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
定制建站策划方案_专业建站与网站建设方案一站式指南
如何快速搭建自助建站会员专属系统?
金*站制作公司有哪些,金华教育集团官网?
如何通过多用户协作模板快速搭建高效企业网站?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何高效利用亚马逊云主机搭建企业网站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何快速搭建FTP站点实现文件共享?
建站之星如何开启自定义404页面避免用户流失?
如何快速搭建支持数据库操作的智能建站平台?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
上海网站制作开发公司,上海买房比较好的网站有哪些?
装修招标网站设计制作流程,装修招标流程?
宝塔Windows建站如何避免显示默认IIS页面?
Python文件管理规范_工程实践说明【指导】
*请认真填写需求信息,我们会在24小时内与您取得联系。