Go反射需用reflect.Value和reflect.Type操作结构体字段,仅导出字段可读写;值类型只读,指针类型才可写;嵌套结构体和切片需逐层访问并校验有效性。

Go语言的反射机制允许在运行时检查和操作结构体字段,但需要遵循类型安全规则。核心是使用reflect.Value和reflect.Type获取字段名、类型、值,并注意导出性(首字母大写)限制。
获取结构体类型和字段信息
使用reflect.TypeOf()获取类型元数据,再通过NumField()和Field(i)遍历字段。每个StructField包含名称、类型、标签等信息。
- 只有导出字段(首字母大写)才能被反射读取或设置
-
field.Name返回字段名,field.Type返回字段类型 -
field.Tag.Get("json")可提取结构体标签中的指定键值
动态读取结构体字段值
用reflect.ValueOf()获得值对象后,调用FieldByName(name)或Field(i)访问具体字段,再用Interface()转回原始类型。
- 若结构体变量是值类型(非指针),反射只能读,不能写
- 读取时建议先用
CanInterface()判断是否可安全转换 - 示例:
v := reflect.ValueOf(user); name := v.FieldByName("Name").String()
动态设置结构体字段值
必须传入结构体指针,否则CanSet()返回false。设置前需确保字段可寻址、可设置且类型匹配。
立即学习“go语言免费学习笔记(深入)”;
- 使用
reflect.ValueOf(&user).Elem()获取可修改的值对象 - 用
FieldByName("Age").SetInt(25)或Set(reflect.ValueOf(25))赋值 - 类型不匹配会panic,建议用
Kind()校验后再设值
处理嵌套结构体与切片字段
反射支持逐层深入:对字段再次调用ValueOf()或Type()即可访问内层结构。切片字段需先确认Kind() == reflect.Slice,再用Len()、Index(i)操作元素。
- 嵌套字段示例:
v.FieldByName("Profile").FieldByName("Email").String() - 切片字段需用
FieldByName("Tags").Index(0).String()取首个元素 - 对
nil切片或未初始化字段,应先检查IsValid()和IsNil()










