Go语言技术文章
-
Go 编译缓存变大时,先用 go env 找到 GOCACHE 和 GOMODCACHE,再按构建、测试、模块下载和 fuzz 缓存分别选择 go clean 参数,避免误删依赖源码。412 收藏 -
Go generate 的关键不是把命令写得更长,而是把指令放进正确的源码包,让相对路径、生成器和输出文件拥有稳定的目录关系。321 收藏 -
竞态修复后吞吐下降不一定是锁竞争。本文用 mutex profile、block profile 和固定基线,判断新增临界区是否真正造成吞吐损失。430 收藏 -
用互斥的 go:build 约束隔离 Go 的生产实现与测试替身,配合 go test -tags 和 go list 检查文件选择,避免测试代码误进入生产构建。423 收藏 -
Go runtime.GOMAXPROCS 改小后延迟变高,常见原因是可运行 goroutine 受限后排队等待;但在容器中设得过大又可能触发 CPU throttling。本文从 CPU 配额、调度并行度和尾延迟三条线说明如何判断参数边界。497 收藏 -
Go GODEBUG 并不是简单的“一次运行开关”。本文区分临时环境变量、shell 继承、go.mod 的 godebug、//go:debug 和进程启动后的修改边界,帮助你判断配置到底影响谁。199 收藏 -
Go 的 log.Fatal 不是普通错误日志,它在输出消息后调用 os.Exit(1)。库代码一旦使用它,调用方进程会被直接终止。本文说明原因、defer 边界、正确的 error 返回方式,以及应用入口该如何接管退出策略。139 收藏 -
Go 的 trace.Stop 太晚会让无关运行阶段混入追踪,也可能因 defer 顺序错误在文件关闭后仍尝试写入。本文用采集窗口和资源生命周期解释正确写法。440 收藏 -
Go 自定义错误只实现 Error() 时,errors.Is 可能无法匹配底层错误或业务哨兵。本文区分 Unwrap、Is 与 As,并给出错误链、语义匹配和常见坑的处理方法。130 收藏 -
用 Go runtime/trace 采集一次请求的短时执行轨迹,结合 task、region 和 go tool trace 观察 goroutine 调度、阻塞、系统调用与 GC 事件。176 收藏 -
Go init 函数一多,启动顺序难查通常不是 init 本身失控,而是包级变量依赖、文件呈现顺序和隐藏副作用混在了一起。本文给出依赖定位、显式构造和重构检查方法。238 收藏 -
Go module graph pruning 不是简单删除 go.mod 条目。本文从 go 1.17+ 的模块图规则出发,说明如何用 go mod graph、go mod why -m 和 go list -m all 定位仍被下载的依赖。168 收藏 -
Go 中 defer 后修改变量却打印旧值,通常是因为参数在 defer 登记时已经求值。本文用最小示例区分参数快照与闭包读取,并给出日志、循环和命名返回值的选择方法。210 收藏 -
Go vendor 模式下,不能只看 go.mod 猜依赖版本。本文用 vendor/modules.txt、go list -mod=vendor 和 go version -m 建立从源码目录到最终二进制的核对路径。276 收藏 -
Go context 创建派生上下文后应尽快调用 cancel。本文解释 WithTimeout 的定时器和父子关系为何需要主动释放,并给出函数、循环、goroutine 的安全写法。112 收藏