-
Go 程序在 arm64 上变慢时,不能只看一组 benchmark 就认定是编译器问题。本文先固定代码、输入和环境,再用 amd64/arm64 对照、同机 Go 工具链对照、CPU profile 和指令集实验,把性能下降归因到业务代码、标准库、运行时或编译器生成代码。
-
Go 交叉编译时报找不到系统库,通常不是 GOOS 或 GOARCH 本身写错,而是项目进入了 cgo 路径却没有目标平台的 C 编译器、头文件或链接库。本文按纯 Go 与 cgo 两条边界给出排查和构建方案。
-
Go json/v2 迁移不能只替换 import。本文区分工具链升级与语义切换,梳理字段匹配、空值、omitempty 和严格输入风险,给出兼容选项示例及发布回退清单。
-
Go 1.22 改变了 for 循环变量的作用域,旧版测试尤其是 t.Parallel 子测试可能从误通过变成真实失败。本文用最小配方解释 go.mod、GOEXPERIMENT=loopvar 与 go vet 的协作方式,帮助你安全完成迁移。
-
Go 1.16 将 io/ioutil 的能力分散到 io 和 os。本文按函数职责整理 ReadFile、ReadDir、ReadAll、临时文件等迁移方式,并说明 DirEntry 与 FileInfo 的兼容边界。
-
Go toolchain 自动下载失败时,可以根据项目是否允许升级,选择 GOTOOLCHAIN=local 或 go1.x.y+path 固定本地工具链,并检查 go.mod、go.work 与 PATH 中的版本关系。
-
Go 依赖升级后出现接口不兼容,先不要盲目回退。本文用 go.mod、go list -m、go mod graph 和编译错误把问题分成导入路径变化、公开 API 断裂与间接依赖切换三类,再给出回退、迁移和兼容适配的选择方法。
-
Go 二进制在 Alpine 启动失败时,应读取 ELF 架构、解释器和动态库需求,区分平台错误与 glibc/musl 不匹配。本文给出 readelf 排查命令,以及纯 Go 构建、musl 重编译和 glibc 运行环境的选择边界。
-
Go 程序在本地和容器中出现时区差异,通常不是 Format 的问题,而是 time.Local、TZ 环境变量与 IANA 时区数据来源不同。本文给出 UTC 存储、显式 Location 展示和容器缺少时区数据库时的兼容方案。
-
Go 日志在容器里延迟出现,通常不是一个笼统的“Go 有缓冲”问题。本文沿着 log/slog 的 handler、stdout/stderr、容器日志流和采集器批量策略逐段定位,并给出不增加无谓缓冲的修复方式。
-
Go http.Server 的 MaxHeaderBytes 只限制解析请求行和请求头的读取范围,不限制请求体。本文从自定义 Server 是否生效、前置代理边界和 MaxBytesReader 三个层面说明为什么看起来仍能收到大请求。
-
Go 收到信号后仍不退出,要区分通知送达、工作取消与 main 生命周期。本文说明缓冲信号通道、NotifyContext、stop、完成回执及有界等待,给出 Linux/macOS 的完整示例并明确超时退出的清理代价。
-
Go 服务健康检查失败而业务接口仍能访问,通常不是业务处理器坏了,而是探针路径、监听地址、状态码或依赖检查边界没有分开。本文用一个最小 net/http 服务拆开存活、就绪和业务依赖检查,并给出按现象定位与部署验收的方法。
-
Go HTTP 客户端重试 POST 时,超时只说明客户端没有拿到结果,并不能证明服务端没有处理。本文从请求体、方法语义、幂等键和响应体关闭四个方面,给出一套可控的重试写法。
-
Go crypto/tls 的 InsecureSkipVerify 会同时跳过证书链和主机名校验。本文说明它的中间人风险,并给出 RootCAs 与 VerifyConnection 的安全替代方案。