-
Redis分布式锁必须使用SETkeyvalueNXPXmilliseconds原子命令实现,NX保证互斥性,PX防止死锁,value须为唯一随机值,解锁和续期均需Lua脚本保障原子性。
-
应包装driver.Conn实现在Prepare、Query、Exec中统一打点,用time.Now()测端到端耗时,阈值建议200ms;须记录脱敏SQL、参数、调用栈及连接ID,避免仅包装db.Query导致漏测网络与执行时间。
-
Go语言支持多返回值,便于错误处理和数据返回。例如funcdivide(a,bint)(int,bool)返回商和成功状态,调用时用result,success:=divide(10,2)接收,可忽略值如_,success:=divide(10,0),还可命名返回值提升可读性,如funcswap(x,yint)(aint,bint){a=y;b=x;return},调用first,second:=swap(1,2)输出21,该特性广泛用于os.Open、strconv.Atoi等函数。
-
统一响应结构体应定义为含Code(int)、Message(string)、Data(interface{})和Timestamp(int64)字段的Response结构,封装Success/Fail等函数统一调用,避免手动c.JSON、双写响应及敏感信息泄露。
-
不会——http.ServeFile默认Content-Disposition为inline,浏览器可能直接打开而非下载;需手动设置attachment头,且必须校验路径防遍历,推荐用ServeContent替代以支持断点续传和缓存控制。
-
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自动机扫描+多模式匹配,边读边识别标记,避免整文件加载与回溯。