PrintFields函数使用reflect包遍历并打印结构体导出字段名与值:先解引用指针,验证为结构体后,循环NumField()获取字段名和Interface()值。
在 Go 中实现通用打印函数来遍历任意对象的字段值,核心是使用 reflect 包。Go 没有泛型反射(直到 Go 1.18+ 泛型配合反射仍需手动处理结构体),但通过 reflect.Value 和 reflect.Type 可安全、递归地访问导出字段(首字母大写)的名称与值。
Go 的反射无法读取未导出字段(小写开头),这是语言设计的安全限制。以下函数仅遍历并打印结构体中可访问的字段名和值:
reflect.ValueOf(v).Kind() == reflect.Ptr 先解引用指针reflect.Struct),否则跳过或报错NumField(),用 Type.Field(i).Name 获取字段名,Value.Field(i).Interface() 获取值示例代码:
func PrintFields(v interface{}) {
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
if val.Kind() != reflect.Struct {
fmt.Printf("not a struct: %v\n", v)
return
}
typ := reflect.TypeOf(v)
if typ.Kind() == reflect.Ptr {
typ = typ.Elem()
}
fmt.Println("Fields:")
for i := 0; i < val.NumField(); i++ {
field := typ.Field(i)
value := val.Field(i).Interface()
fmt.Printf(" %s: %v\n", field.Name, value)
}
}
若想深入打印嵌套结构体、map、slice 等复合类型,需递归处理。注意控制深度防止无限循环(如循环引用),并区分基础类型与容器类型:
struct:递归调用自身,加缩进标识层级map:遍历 key-value,key 必须可比较(通常没问题),value 递归处理slice/array:遍历每个元素,递归打印interface{}:先取底层值再判断种类
函数、channel、unsafe.Pointer 等不可打印类型可封装为 PrintDeep(v interface{}, indent string),初始调用传 ""。
如果目标只是“可读地查看字段”,不必手写反射:
fmt.Printf("%+v\n", obj):标准库最简方式,显示字段名和值(含未导出字段为零值,不显示真实值)json.MarshalIndent(obj, "", " "):自动忽略未导出字段,输出格式化 JSON(要求字段可序列化)spew.Dump(obj),深度打印所有字段(含未导出字段,调试利器)反射易出错,实际使用需留意:
if v == nil 或 reflect.ValueOf(v).IsValid() 校验val.Elem() 再判断,否则 Kind() 可能是 Interface 而非目标类型
# js
# json
# go
# golang
# 标准库
# String
# Array
# if
# 封装
# printf
# 结构体
# 递归
# 循环
# 指针
# 接口
# Struct
# Interface
# 泛型
# pointer
# nil
# map
# channel
# 对象
# kind
# bug
# 遍历
# 字段名
# 这是
# 跳过
# 的是
# 较低
# 报错
# 而非
# 第三方
相关文章:
黑客如何通过漏洞一步步攻陷网站服务器?
C#如何在一个XML文件中查找并替换文本内容
如何快速搭建二级域名独立网站?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
平台云上自助建站如何快速打造专业网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
黑客入侵网站服务器的常见手法有哪些?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何在Tomcat中配置并部署网站项目?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
三星网站视频制作教程下载,三星w23网页如何全屏?
建站主机是否属于云主机类型?
家具网站制作软件,家具厂怎么跑业务?
自助网站制作软件,个人如何自助建网站?
如何确保西部建站助手FTP传输的安全性?
如何规划企业建站流程的关键步骤?
江苏网站制作公司有哪些,江苏书法考级官方网站?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
如何正确选择百度移动适配建站域名?
C#怎么使用委托和事件 C# delegate与event编程方法
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何挑选高效建站主机与优质域名?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
c# 服务器GC和工作站GC的区别和设置
建站之星收费标准详解:套餐费用及年费价格表一览
如何通过VPS建站实现广告与增值服务盈利?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
红河网站制作公司,红河事业单位身份证如何上传?
如何通过虚拟主机快速搭建个人网站?
定制建站是什么?如何实现个性化需求?
如何快速查询网站的真实建站时间?
深入理解Android中的xmlns:tools属性
如何快速完成中国万网建站详细流程?
如何在Windows 2008云服务器安全搭建网站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
h5在线制作网站电脑版下载,h5网页制作软件?
如何用西部建站助手快速创建专业网站?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
TestNG的testng.xml配置文件怎么写
建站之星后台密码遗忘?如何快速找回?
建站之星在线版空间:自助建站+智能模板一键生成方案
大连网站设计制作招聘信息,大连投诉网站有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。