与“typeof”相关的TAG标签
reflect.ValueOf(v).Field(i)panic的主因是类型非结构体或索引越界;安全访问需先确认Kind()==reflect.Struct且i
reflect操作慢因每次调用需运行时类型检查、接口转换和内存分配;缓存字段元数据可优化性能,应以t.PkgPath()+"."+t.Name()为key,用sync.RWMutex保护map,并预计算fieldInfo结构体。
lock(newobject())几乎没用,因为每次新建对象实例导致线程锁不同对象,无法实现互斥;正确做法是用privatestaticreadonlyobject_syncLock=newobject()确保共享同一引用。
私有字段能被reflect修改,但需满足可寻址、同包访问等条件;跨包时仅能通过unsafe.Pointer按偏移量操作,且风险极高。
自定义Attribute需继承System.Attribute并用AttributeUsage限定目标(如仅方法),类名建议以Attribute结尾;应用时通过反射读取,缺失时返回null而非异常,性能敏感场景应缓存或配合SourceGenerator在编译期处理。
MethodByName返回nil的主因是方法未导出或reflect.Value不可寻址;接口需先Elem()解包具体值;不支持嵌入方法自动查找;反射调用性能低且易panic,应缓存Method并谨慎使用。
必须用reflect.TypeOf获取字段名、类型、标签,用reflect.ValueOf读取或设置字段值;两者需配合使用,且结构体字段须导出(首字母大写),否则反射无法访问其值。
Go高频分配对象应使用sync.Pool复用,unsafe.Slice/unsafe.String避免拷贝,math/bits替代位运算循环,禁用interface{}和反射;四者结合可使图算法和字符串匹配吞吐量提升2–5倍。
AssignableTo判断类型赋值兼容性而非结构等价,仅检查顶层类型关系,如接口实现、指针转换等;对命名类型与底层类型、interface{}包装值、nil等场景易误判,应优先使用泛型或接口替代反射判断。
interface{}可存指针,但仅当类型以T实现方法时,T才能满足接口;T值无法调用*T方法,传参需用&v而非v,标准库接口多要求指针实现。
