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。设置前需确保字段可寻址、可设置且类型匹配。
reflect.ValueOf(&user).Elem()获取可修改的值对象FieldByName("Age").SetInt(25)或Set(reflect.ValueOf(25))赋值Kind()校验后再设值反射支持逐层深入:对字段再次调用ValueOf()或Type()即可访问内层结构。切片字段需先确认Kind() == reflect.Slice,再用Len()、Index(i)操作元素。
v.FieldByName("Profile").FieldByName("Email").String()
FieldByName("Tags").Index(0).String()取首个元素nil切片或未初始化字段,应先检查IsValid()和IsNil()