Go问答技术文章
-
Go DNS 查询超时后仍看到延迟,常见原因不是 context 失效,而是调用了不带 context 的包级函数、纯 Go 解析发生重试,或 cgo 底层阻塞调用尚未收尾。本文给出区分三种情况的排查与写法。229 收藏 -
解释 Go gzip.Reader 为什么要在完整读取后仍然 Close,并演示如何分别处理 ErrChecksum、os.File 和 HTTP 响应体的关闭责任。229 收藏 -
strings.Builder.String 返回后继续写,旧字符串通常不会被业务代码直接改写,但 Builder 可能复用底层缓冲区并触发扩容。本文用源码和小实验拆开共享存储、扩容与 Reset 的边界。228 收藏 -
讲清 Go json.Decoder 开启 DisallowUnknownFields 后的未知字段错误,给出按 API 版本分流严格与兼容解码、检查尾部数据、记录迁移和逐步收紧的实用方案。228 收藏 -
Go 的 StdEncoding 会保留 Base64 的 = 补位,RawStdEncoding 使用相同字母表但省略补位。本文用输入长度、编解码配对和 URL 字母表三个边界说明如何选择。228 收藏 -
围绕 Go net/http Cookie.Partitioned 说明 CHIPS 的设置方式、Secure 与 SameSite=None 的组合要求,以及浏览器兼容和降级核验边界。227 收藏 -
Go TestMain 初始化失败不能只写 return,否则测试入口可能按 m 的默认退出状态结束。本文说明 m.Run、资源清理、flag.Parse 与 os.Exit 的正确组合。227 收藏 -
Go 的 exclude 和 retract 都能避开问题版本,但作用域完全不同:exclude 是消费方修正自己的模块图,retract 是模块作者撤回已发布版本。本文用场景、示例和验证命令说明如何选择。227 收藏 -
Go 把切片传入函数时,底层数组可能仍被共享,但切片头会按值传递。文章用最小示例解释 append 后为什么调用方的长度不变,给出返回新切片、指针修改与预分配三种边界清楚的写法,并说明 cap 足够时容易看到的隐藏覆盖。226 收藏 -
Go 的 PATCH 接口如果直接把请求体解码到普通结构体,字段缺失和显式 null 很容易被合并。本文用指针与 json.RawMessage 设计可验证的更新参数,说明两种方案的取舍、错误处理和兼容边界。226 收藏 -
Go 1.26 让 new 函数可以直接接收表达式,适合构造 JSON 可选字段和配置指针。本文从旧写法、版本门槛、兼容回退和最小验证说明哪些代码值得改、哪些不该急着改。226 收藏 -
解释 filepath.WalkDir 回调返回 fs.SkipDir 时的目录跳过和文件级遍历终止语义,并用可运行示例验证判断顺序。226 收藏 -
Go signal.Notify 收不到 SIGTERM 时,先检查通知 channel 是否有缓冲、是否持续读取,再核对 systemd 或容器托管的真实 PID,并区分 SIGTERM 与无法捕获的 SIGKILL。226 收藏 -
Go map 的 value 是指针时,单独判断 v == nil 会混淆缺失键和已保存的 nil。用 comma-ok 先判断键是否存在,再判断指针值,map[string]any 还要留意 typed nil。226 收藏 -
解释 Go sort.SliceIsSorted 遇到 NaN 时看似判断异常的原因,拆开相邻比较与 IEEE 754 语义,并给出拒绝、过滤或显式排序 NaN 的一致比较器写法。226 收藏