反射设值需满足可寻址性、类型匹配、字段可见性三条件:须传指针并Elem()获取可寻址值;Set方法要求类型完全一致或可赋值;仅导出字段可被FieldByName访问和修改。用 reflect.Value.Set() 前必须确保值可寻址直接对结构体字面量或函数参数做 reflect.ValueOf(myStruct).FieldByName("X").Set(...) 会 panic:reflect: reflect.Value.Set using unaddressable value。这是因为 reflect.ValueOf() 默认返回不可寻址的副本。正确做法是传入指针,并用 reflect.Indirect() 解引用:type User struct { Name string Age int}u := User{Name: "Alice"}v := reflect.ValueOf(&u).Elem() // ← 关键:取指针再 .Elem()v.FieldByName("Name").SetString("Bob")结构体变量本身不可寻址,但 &u 可寻址,.Elem() 后得到其字段的可寻址 Value如果传入的是 *User 类型变量,也得先 reflect.ValueOf(ptr).Elem(),不能跳过切片、map、channel 等引用类型本身可寻址,但字段嵌套时仍要逐层确认是否可寻址SetString() / SetInt() 等方法只接受同类型值反射设置字段值不是"类型擦除"操作------FieldByName("Age").SetInt(25) 要求该字段确实是 int 类型;若字段是 int64,就会 panic:reflect: cannot set int64 using int。常见错误场景:从 JSON 或配置读出的数字默认是 float64,想设进 int 字段时直接调 SetFloat() 会失败。立即学习"go语言免费学习笔记(深入)"; 幻导航网 发现优质实用网站,开启网络探索之旅!
相关推荐
oradh3 小时前
Oracle TX 锁 Mode 4(Share)问题排查总结yi.Ist4 小时前
数据定义语言-DDL操作傲笑风4 小时前
【openvino】tinybert基于openvino服务化部署(四)维基框架5 小时前
WIKI 知识库 v1.1.1 正式发布2601_963282775 小时前
工程项目、政企采购为什么优先选择对讲机批量采购?Doraemomo5 小时前
SQLite数据库云贝教育-郑老师6 小时前
MySQL 的“黑匣子“:Performance Schema 把数据库内部变成一张可查的表这个DBA有点耶8 小时前
同城双活落地的三座山:网络延迟、脑裂预防、反向同步青春之我_XP8 小时前
MySQL 常用日期函数 实战指南