全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现对象字段遍历打印_支持任意结构体

用Go反射遍历任意结构体字段需传指针,通过reflect.ValueOf和reflect.TypeOf获取值与类型,递归处理结构体、切片、map等,支持标签解析与缩进打印。

用 Go 语言遍历任意结构体字段并打印,核心是 反射(reflect)。Go 不支持传统意义上的“运行时字段枚举”,但 reflect 包提供了安全、通用的方案,适用于任意嵌套结构体、指针、基础类型、切片、map 等。

获取结构体反射值并遍历字段

必须传入结构体指针(*T),否则 reflect.Value 无法获取导出字段(首字母大写)。使用 reflect.TypeOfreflect.ValueOf 获取类型和值信息,再通过 .NumField().Field(i) 遍历:

  • 先判断是否为指针,用 .Elem() 解引用到实际结构体值
  • 确保值是结构体(.Kind() == reflect.Struct
  • .Type().Field(i) 获取字段名、标签;.Field(i) 获取字段值

处理嵌套结构体与常见类型

递归是关键。对每个字段值做类型判断,再决定是否深入:

  • 结构体或指针指向结构体:递归调用打印函数(注意空指针检查)
  • 切片/数组:遍历元素,对每个元素递归处理
  • map:遍历 key-value,value 递归处理
  • 基本类型、字符串、布尔等:直接格式化输出
  • nil 接口、nil 指针、未导出字段:跳过或打日志提示(不 panic)

支持结构体标签(tag)与缩进美化

通过 structField.Tag.Get("json") 或自定义 tag(如 "print")控制显示逻辑。配合层级深度参数实现缩进,提升可读性:

  • 每层递归传入当前缩进级别(如 indent + " "
  • 字段名优先使用 tag 中的 json 名(若存在且非 "-"), fallback 到原始字段名
  • 对 slice/map 长度、结构体地址等元信息可选择性打印(增强调试能力)

完整可用示例代码

以下是一个轻量、健壮的打印函数(已处理空指针、循环引用简化、非导出字段跳过):

func PrintStruct(v interface{}, indent string) {
	rv := reflect.ValueOf(v)
	if !rv.IsValid() {
		fmt.Println(indent + "(invalid)")
		return
	}
	if rv.Kind() == reflect.Ptr {
		if rv.IsNil() {
			fmt.Println(indent + "")
			return
		}
		fmt.Println(indent + "&{")
		PrintStruct(rv.Elem().Interface(), indent+"  ")
		fmt.Println(indent + "}")
		return
	}
	if rv.Kind() != reflect.Struct {
		fmt.Printf("%s%v\n", indent, rv.Interface())
		return
	}

	rt := reflect.TypeOf(v).Elem()
	for i := 0; i < rv.NumField(); i++ {
		field := rt.Field(i)
		value := rv.Field(i)
		if !value.CanInterface() { // 非导出字段跳过
			continue
		}
		name := field.Name
		if jsonTag := field.Tag.Get("json"); jsonTag != "" && jsonTag != "-" {
			if idx := strings.Index(jsonTag, ","); idx > 0 {
				name = jsonTag[:idx]
			} else {
				name = jsonTag
			}
		}
		fmt.Printf("%s%s: ", indent, name)
		PrintStruct(value.Interface(), indent+"  ")
	}
}


# js  # json  # go  # golang  # 格式化输出  # print  # 字符串  # 结构体  # 递归  # 循环  # 指针  # 接口  # Struct  # 空指针  # 切片  # nil  # map  # 对象  # typeof  # kind  # 遍历  # 跳过  # 字段名  # 是一个  # 适用于  # 布尔  # 自定义  # 不支持  # 判断是否 


相关文章: 公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  Bpmn 2.0的XML文件怎么画流程图  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在Windows环境下新建FTP站点并设置权限?  ,柠檬视频怎样兑换vip?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何配置WinSCP新建站点的密钥验证步骤?  如何在橙子建站上传落地页?操作指南详解  如何通过虚拟机搭建网站?详细步骤解析  魔方云NAT建站如何实现端口转发?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  c# 在高并发场景下,委托和接口调用的性能对比  重庆网站制作公司哪家好,重庆中考招生办官方网站?  Thinkphp 中 distinct 的用法解析  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  建站主机系统SEO优化与智能配置核心关键词操作指南  东莞专业制作网站的公司,东莞大学生网的网址是什么?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  红河网站制作公司,红河事业单位身份证如何上传?  网站制作的步骤包括,正确网址格式怎么写?  建站之星如何快速更换网站模板?  如何选择CMS系统实现快速建站与SEO优化?  简历在线制作网站免费版,如何创建个人简历?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何制作网站标识牌,动态网站如何制作(教程)?  建站之星免费模板:自助建站系统与智能响应式一键生成  网站制作软件有哪些,制图软件有哪些?  设计网站制作公司有哪些,制作网页教程?  怀化网站制作公司,怀化新生儿上户网上办理流程?  如何快速完成中国万网建站详细流程?  教学论文网站制作软件有哪些,写论文用什么软件 ?  广州美橙建站如何快速搭建多端合一网站?  建站之星客服服务时间及联系方式如何?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何快速生成可下载的建站源码工具?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  建站之星后台密码如何安全设置与找回?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在局域网内绑定自建网站域名?  想学网站制作怎么学,建立一个网站要花费多少?  建站主机类型有哪些?如何正确选型  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  如何选购建站域名与空间?自助平台全解析  如何通过万网虚拟主机快速搭建网站?  如何访问已购建站主机并解决登录问题?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  教学网站制作软件,学习*后期制作的网站有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。