golang遍历结构体_反射遍历字段与方法信息应用实例-Golang

必须先调用.Elem()解引用指针才能遍历结构体字段,否则.NumField()返回0或panic;需确保字段导出(首字母大写)才可安全读取,私有字段反射访问会panic。

怎么用 reflect.Value 遍历结构体字段并读取值

直接用 reflect.ValueOf 获取结构体的反射值后,必须先调用 .Elem()(如果原值是指针),否则会得到指针类型而非结构体本身。常见错误是忘记解引用,导致 .NumField() 返回 0 或 panic。

实操要点:

  • 传入结构体变量时,推荐用地址: reflect.ValueOf(&s),再调用 .Elem()
  • 遍历字段前检查是否为结构体:v.Kind() == reflect.Struct
  • 字段值需通过 v.Field(i) 获取,不能直接用 v.Field(i).Interface() 读私有字段(会 panic)
  • 若要安全读私有字段,得确保该字段是导出的(首字母大写),否则只能用 UnsafeAddr 等非常规手段(不推荐)

示例:

type User struct {
    Name string
    age  int // 小写 → 私有 → 反射不可读
}
u := User{Name: "Alice"}
v := reflect.ValueOf(&u).Elem()
for i := 0; i < v.NumField(); i++ {
    field := v.Field(i)
    if field.CanInterface() { // 只有导出字段才返回 true
        fmt.Println(field.Interface())
    }
}

如何用 reflect.Type 获取字段名、类型、标签(tag)

reflect.Type 负责描述“是什么”,比如字段名、类型、结构体标签;而 reflect.Value 负责“值是多少”。两者常配合使用——先用 Type 拿元信息,再用 Value 取值。

关键点:

  • t.Field(i).Name 返回字段名(如 "Name"),t.Field(i).Type 返回字段类型(如 string)
  • 标签需用 t.Field(i).Tag.Get("json") 提取,注意 tag 值是字符串字面量,不含引号
  • 若字段是嵌套结构体,t.Field(i).Type.Kind() 会是 reflect.Struct,可递归处理
  • 匿名字段(内嵌)的 t.Field(i).Anonymous 为 true,其字段会“提升”到外层结构体中

示例(提取 json 标签):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » golang遍历结构体_反射遍历字段与方法信息应用实例-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4036656+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4036656+
  • 本周更新: 0+
  • 最后更新: 2026-03-16