-
Go语言可通过reflect包实现通用字段赋值,支持嵌套路径(如"A.B.C")、nil指针自动初始化、数组索引及多类型值转换,需确保字段导出、可寻址且可设置,并封装为SetField(obj,path,value)工具函数。
-
结构体是Go语言中用于组合不同类型字段的自定义数据类型,支持字段可见性控制、嵌套及匿名字段实现组合。通过type定义结构体,如typePersonstruct{Namestring;Ageint},字段首字母大写为公有,小写为私有;可嵌套其他结构体建模复杂数据,如HomeAddrAddress;支持匿名字段实现字段提升,如Animal嵌入Dog后可直接访问Species。使用new或&创建指针实例,强调组合而非继承,提升代码复用与维护性。
-
数组固定长度适合小数据,切片动态扩容更灵活;遍历和访问性能相近,但传参和扩容时切片更高效;建议小规模用数组,大规模及动态场景用切片并预设容量。
-
errors.Join支持多错误并列聚合,可多次Unwrap展开;fmt.Errorf(%w)仅单层包装,且%w后nil会panic;errors.Is/As可跨层级判断,日志推荐%+v打印全链。
-
Go语言无稳定安全的goroutineID获取方式;解析runtime.Stack()或用unsafe读取g结构体均不可靠,易失效、影响性能、破坏可移植性,应改用request_id、context、GoroutineProfile等正确方案。
-
Go函数应返回error类型表示错误,使用fmt.Errorf包装并保留错误链,自定义错误类型增强语义,避免用nil或空字符串混淆错误信号,确保调用方能正确处理。
-
不能直接用log.Printf记录用户行为,因其输出到stderr、无结构、不同步、难检索;需结构化(如JSON)、异步写入、支持分析存储;可用zap+chan封装异步采集,缓冲1000并超时丢弃。
-
RWMutex在读多写少时性能优于Mutex,但写频繁或读锁持有时间长时反而更慢且易引发goroutine饥饿;其内部状态复杂、读写竞争加剧调度开销,写占比超30%时吞吐量可能低20%~40%。
-
Gomap非线程安全,需用sync.Map或封装加锁;声明后必须make初始化;判断key存在须用v,ok双赋值;预估容量避免扩容;key宜用简单类型,value大时存指针;迭代顺序随机不可依赖。
-
不能直接用strings.ReplaceAll处理大文件,因为其O(N×M)扫描和多次内存拷贝易导致OOM;应采用流式读取+单次AC自动机扫描+多模式匹配,边读边识别标记,避免整文件加载与回溯。
-
goenv显示Go工具链实际使用的环境变量,非shell环境变量;支持查看全部(goenv)、单个(goenvGOPATH)、写入(goenv-wGOPATH=...)和取消(goenv-uGOPATH)配置,修改立即生效。
-
Go标准库无内置LRU,需用container/list+map+sync.RWMutex实现;sync.Map不适用因无法维护访问序、不能原子执行查map/移节点/返回值,且并发MoveToFront会panic;正确做法是map存*list.Element,Element.Value为含key/value的结构体,读写加锁粒度要细,容量控制须先插后删,四者并发对齐才稳定。
-
Go反射拼SQL最常因未检查nil指针导致panic,需用v.Kind()==reflect.Ptr&&v.IsNil()判断并跳过或按NULL处理;优先用带dbtag的结构体而非map;反射元信息应缓存避免重复遍历。
-
slog默认不支持级别过滤,需自定义Handler实现:通过LevelFilterHandler包装标准Handler,在Handle方法中判断rec.Level>=minLevel决定是否输出。
-
Go的url.Values.Encode()会自动按键字典序排序后编码,因此无需手动维护原始提交顺序;服务端应统一采用排序后的字符串进行哈希校验,以保证结果确定性。