如何使用Golang反射获取结构体字段_使用reflect包动态访问结构体属性

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

Go语言的反射机制允许在运行时检查和操作结构体字段,但需要遵循类型安全规则。核心是使用reflect.Valuereflect.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。设置前需确保字段可寻址、可设置且类型匹配。

  • 使用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()