您的位置:首页 >Golang反射是什么?reflect机制详解
发布于2026-02-25 阅读(0)
扫一扫,手机访问
Go反射是运行时读写类型和值的工具,非动态类型系统;TypeOf返回Type接口描述类型,ValueOf返回Value封装值;nil指针需判空;判断切片用Kind();指针取目标类型需Elem();修改struct字段须满足导出、传指针、Elem()三条件;Tag需手动解析;方法调用严格区分值/指针接收器。

Golang反射不是“动态类型系统”,而是运行时读写类型和值的工具——它不改变Go的静态类型本质,只帮你绕过编译期限制去处理未知结构。
这两个函数是反射的入口,但返回值性质完全不同:reflect.TypeOf 返回 reflect.Type 接口,描述“类型本身”(比如字段名、方法列表、是否是指针);reflect.ValueOf 返回 reflect.Value,封装“值的运行时表示”,支持读写操作。
nil 指针调用 reflect.TypeOf 会返回 nil,必须先判空再调用 .Kind()Type.String() == "[]string"(含包路径,不稳定),改用 Value.Kind() == reflect.SliceKind 是 ptr,要取目标类型得链式调用:reflect.TypeOf(&x).Elem().Kind()哪怕你写对了字段名、标签、路径,只要漏掉其中任一条件,CanSet() 就返回 false,Set* 会 panic。
*struct(指针),不能是 struct 值reflect.ValueOf(ptr).Elem() 获取可寻址的 struct 实例,再调 FieldByName常见错误现象:panic: reflect: reflect.Value.SetString using unaddressable value —— 本质就是没传指针或没调 Elem()。
结构体字段上的 json:"user_id" 或 inject:"env=PORT,default=8080" 是字符串,reflect.StructTag 不自动解析,你得自己切分。
ft.Tag.Get("json") 获取原始 tag 字符串,不是 fv.Tag.Get("json")(Value 没有 Tag 方法)env=DEBUG,default=true)需手动 strings.Split + strings.HasPrefix 提取strconv.ParseBool/strconv.Atoi 转换,不能直接 SetStringMethodByName("Foo").Call() 看似简单,但 Go 对接收器类型极其严格:
func (u User) Name() string)只能在 reflect.ValueOf(u) 上调用,不能在 &u 上调func (u *User) Save() error)只能在 reflect.ValueOf(&u) 上调用,且 Call 前要确保 IsValid() 和 CanInterface()int 和 int64 视为不同,传错会 panic最容易被忽略的是:嵌套结构体中某字段是 *T 且为 nil,你试图通过反射调它的方法时,MethodByName 返回无效值(IsValid() == false),但不会报错,只会静默失败。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9