Go语言技术文章
-
不能直接用log.Printf记录用户行为,因其输出到stderr、无结构、不同步、难检索;需结构化(如JSON)、异步写入、支持分析存储;可用zap+chan封装异步采集,缓冲1000并超时丢弃。252 收藏 -
RWMutex在读多写少时性能优于Mutex,但写频繁或读锁持有时间长时反而更慢且易引发goroutine饥饿;其内部状态复杂、读写竞争加剧调度开销,写占比超30%时吞吐量可能低20%~40%。486 收藏 -
Gomap非线程安全,需用sync.Map或封装加锁;声明后必须make初始化;判断key存在须用v,ok双赋值;预估容量避免扩容;key宜用简单类型,value大时存指针;迭代顺序随机不可依赖。166 收藏 -
不能直接用strings.ReplaceAll处理大文件,因为其O(N×M)扫描和多次内存拷贝易导致OOM;应采用流式读取+单次AC自动机扫描+多模式匹配,边读边识别标记,避免整文件加载与回溯。419 收藏 -
goenv显示Go工具链实际使用的环境变量,非shell环境变量;支持查看全部(goenv)、单个(goenvGOPATH)、写入(goenv-wGOPATH=...)和取消(goenv-uGOPATH)配置,修改立即生效。395 收藏 -
Go标准库无内置LRU,需用container/list+map+sync.RWMutex实现;sync.Map不适用因无法维护访问序、不能原子执行查map/移节点/返回值,且并发MoveToFront会panic;正确做法是map存*list.Element,Element.Value为含key/value的结构体,读写加锁粒度要细,容量控制须先插后删,四者并发对齐才稳定。500 收藏 -
Go反射拼SQL最常因未检查nil指针导致panic,需用v.Kind()==reflect.Ptr&&v.IsNil()判断并跳过或按NULL处理;优先用带dbtag的结构体而非map;反射元信息应缓存避免重复遍历。422 收藏 -
slog默认不支持级别过滤,需自定义Handler实现:通过LevelFilterHandler包装标准Handler,在Handle方法中判断rec.Level>=minLevel决定是否输出。117 收藏 -
Go的url.Values.Encode()会自动按键字典序排序后编码,因此无需手动维护原始提交顺序;服务端应统一采用排序后的字符串进行哈希校验,以保证结果确定性。399 收藏 -
HTTP请求体直接读取大文件会OOM,因io.ReadAll等函数将整个文件加载进内存;multipart表单默认ParseMultipartForm会全量读入内存,需手动用multipart.Reader解析并禁用自动解析。451 收藏 -
本文详解如何修正Go中正则表达式匹配逻辑,避免仅提取每行首单词的问题,通过FindAllString替代FindString、移除^锚点、并优化编译位置,实现对每行全部英文单词的完整提取与处理。317 收藏 -
应限定子目录并禁用路径遍历:用http.Dir("./uploads")指定服务目录,外层包装handler拦截../请求;上传时需合理设置ParseMultipartForm参数,避免OOM或临时文件堆积。344 收藏 -
Go语言中基准测试通过testing.B可精准测函数性能,需以Benchmark开头、用b.N循环、防编译优化,运行gotest-bench=.查看ns/op等指标,配合-benchmem分析内存分配。469 收藏 -
使用Golang实现用户认证需定义User结构体并用map模拟存储;2.通过bcrypt哈希密码保障安全;3.利用JWT生成带签名的令牌用于身份验证;4.提供注册登录接口完成用户管理;5.设计中间件校验JWT以保护受限制路由。301 收藏 -
使用Golang通过rate.Limiter实现全局限流与IP级限流,结合gobreaker断路器进行服务降级,支持动态配置与健康检查,构建高并发下稳定的HTTP服务防护体系。225 收藏