章节

16.4 结构体反射

本篇学习通过反射读取结构体字段信息,并能获取字段名、类型、tag 与字段值。

结构体反射

概念说明

结构体反射可以在运行时读取字段信息。
例如字段名、字段类型、字段 tag、字段当前值等。

这类能力常用于 JSON、表单绑定、ORM、配置解析等框架场景。

语法/规则

  1. 使用 reflect.TypeOf(structValue) 获取结构体类型。
  2. 使用 reflect.ValueOf(structValue) 获取结构体值。
  3. 使用 NumField() 获取字段数量。
  4. 使用 Type.Field(i) 获取字段元信息。
  5. 使用 Value.Field(i) 获取字段值。
  6. 读取 tag 可以使用 field.Tag.Get("json")

读取结构体字段示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	user := User{Name: "abin", Age: 21}
	typ := reflect.TypeOf(user)
	val := reflect.ValueOf(user)

	for i := 0; i < typ.NumField(); i++ {
		field := typ.Field(i)
		value := val.Field(i) // 读取第 i 个字段的实际值
		fmt.Println(field.Name, field.Tag.Get("json"), value.Interface())
	}
}

输出结果:

1
2
Name name abin
Age age 21

常见错误

  1. 把结构体指针直接当成结构体处理,忘记先调用 Elem()
  2. 读取未导出字段的 Interface(),可能触发 panic。
  3. 以为 tag 会自动生效,实际 tag 只是字符串元信息,需要代码或库去读取。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字