Go问答技术文章
-
Go 客户端偶发 EOF 时,先区分响应头已收到但响应体中途断开,还是请求阶段根本没有建立完整响应,再结合已读字节、Content-Length、请求标识和服务端日志判断是否为服务端提前关闭,最后只对可安全重建的幂等请求有限重试。200 收藏 -
Golang · Go问答 | 1天前 | JSON · 基准测试 · go · pprof · 性能排查 · 内存分配 encoding/json pprof Go JSON JSON性能 go test benchmark
Go JSON 编解码慢时,不要只看 ns/op。本文用固定输入、benchmem、CPU profile 和内存 profile,区分 JSON 计算热点、短命对象分配与存活堆增长,再按证据选择优化动作。102 收藏 -
Golang · Go问答 | 1天前 | go · 垃圾回收 · 性能排查 · 运行时 · 内存分配 GOGC Go GC runtime.MemStats HeapAlloc TotalAlloc NumGC
Go GC 频繁触发时,先用 TotalAlloc 增量判断分配速率,再对照 HeapAlloc、HeapObjects 和 NumGC,区分短命对象过多、存活堆增长与调参边界。本文用一个最小采集器给出判断路径。395 收藏 -
Go heap 默认存活视图可能看不到已回收的短命对象。切换 alloc_space、alloc_objects,并结合业务观察窗口、MemProfileRate 与实际堆分配,区分分配压力和存活容量,避免误判泄漏或盲目提高采样精度。483 收藏 -
Go pprof 的 CPU 表里,flat 表示函数自身占用的采样,cum 表示函数连同下游调用链的累计采样。本文用调用关系、命令和误区说明两列该怎样配合阅读。447 收藏 -
Golang · Go问答 | 1天前 | 基准测试 · go · testing · 性能优化 · 性能测试 CPU count GOMAXPROCS testing.B Go benchmark benchtime
Go benchmark 结果波动大时,应先固定计时边界、-benchtime、-count、-cpu 和机器状态,再用多份样本判断优化是否稳定。本文给出 testing.B、GOMAXPROCS 和环境噪声的排查方法。356 收藏 -
解释 go test 的两种执行模式、(cached) 命中条件、count=1 对照方法和 go clean -testcache 的清理边界,帮助排查修改后结果不变。195 收藏 -
Go test 报 internal package not allowed 或找不到内部包时,关键不是测试命令本身,而是导入者是否位于 internal 父目录树内。本文用目录、module 和测试包名拆出根因与修复方式。314 收藏 -
Go recover 必须在发生 panic 的同一 goroutine 中由延迟函数直接调用,父函数不能恢复子任务 panic。通过同步与异步示例解释恢复位置、命名返回值和 Result 回传,并保留堆栈、明确数据一致性与新任务边界。461 收藏 -
Go 中 errors.As 取不到自定义错误字段,通常不是字段不存在,而是目标类型、指针层级或错误链没有对上。本文从故障现场拆开直接返回、%w 包装、值与指针接收者和 Unwrap 的边界,给出可复查的修复清单。166 收藏 -
Go 中 errors.Is 返回 false,通常不是判断函数失效,而是错误链没有通过 %w 保留下来,或比较目标每次都由 errors.New 新建。本文用最小示例拆开包装、哨兵错误、自定义 Is 和 errors.Join 的边界,给出可复查的修复清单。494 收藏 -
Go goroutine 捕获循环变量可通过显式形参固定每轮任务值。本文区分 Go 1.22 后的声明式循环与外部变量复用,用 WaitGroup 给出完整示例,并解释指针、切片和 map 的共享边界,避免把参数副本误当深拷贝。369 收藏 -
Go range 中直接保存 &value,可能把循环变量副本的地址重复保存,导致多个指针看起来指向同一个对象。本文从切片、map、闭包和 Go 1.22 模块语义四个边界排查原因,并给出稳定的下标取址与独立副本写法。456 收藏 -
解释 Go defer 在循环中的函数边界,给出局部函数及时关闭文件的写法,并整理打开、读取、关闭和并发上限的排障清单。276 收藏 -
解释 Go defer 参数求值、闭包捕获和 Go 1.22 循环变量语义,给出跨版本固定每轮值的写法。295 收藏