Go问答技术文章
-
Go 的 initorder 是编译器内部的初始化依赖分析,不是应用层排序 API。本文用显式包级依赖、单一初始化器和 init 边界说明如何稳定表达初始化顺序。253 收藏 -
围绕 Go archive/tar 的 Header.Name 讲清普通相对路径、父目录跳转、tar.ErrInsecurePath、链接条目和固定解压根目录的安全判断方法。253 收藏 -
Go HTTP 客户端遇到 307/308 时必须重新读取请求体;若 Request.GetBody 为空且 Body 非空,客户端会停在重定向响应。本文说明自动设置 GetBody 的类型、自定义文件重开方式,以及重定向目标和幂等性控制。253 收藏 -
slices.Grow 的承诺是为接下来的 n 个元素预留至少够用的空间,不是把容量固定成某个数字。理解 len、cap、n 与 append 的关系,才能正确判断是否发生了额外分配。252 收藏 -
Go 1.23 支持对特定函数类型使用 for range。文章给出 iter.Seq 的最小写法,解释 yield 返回 false 的停止契约、三种允许签名、go.mod 版本边界和面向旧工具链的采用建议。251 收藏 -
Go 服务重新发布后,用户仍拿到旧 JS 或旧 CSS,通常不是浏览器“没刷新”,而是入口 HTML 与带指纹资源用了同一套缓存策略。本文用 Cache-Control、ETag 和文件名指纹拆出一套可验证的静态资源发布方式。251 收藏 -
io.Copy 看起来只是把 Reader 写入 Writer,但 src 的 WriterTo、dst 的 ReaderFrom 以及 bufio.Writer 等包装器会改变实际路径。本文用可运行示例拆开快路径、包装器边界和验证方法,帮助定位复制速度突然下降的问题。251 收藏 -
Go regexp.FindAllStringIndex 返回的是字节下标,不是字符序号。本文用中文字符串拆开说明下标、切片、Rune 边界和常见误用,给出可直接验证的安全写法。251 收藏 -
Go 的 ResponseWriter 在第一次 Write 时可能已经隐式提交 200 OK。本文解释为什么正文之后再设置状态码无效,并给出错误分支、响应头和业务结果的稳定写法。250 收藏 -
Go pprof 里的 CPU、mutex 和 block profile 关注的不是同一件事。本文用一个采集窗口说明三者的开关、命令、栈位置和适用边界,帮助你判断到底是 CPU 忙还是 goroutine 在等锁、等通道。250 收藏 -
Go atomic.Pointer 的 Load 返回 nil,只能说明当前没有对象,不能区分零值未初始化和曾有对象后被 Store(nil) 清空。本文用额外状态位和 CAS 说明如何设计可判断的生命周期状态。250 收藏 -
讲清 Go slices.Grow 的额外容量参数、返回值和循环位置:按预计总数计算剩余数量,在 append 前一次预留,避免把容量误当长度。250 收藏 -
Go slog.Group 只传组名却看不到字段时,通常是空组被 Handler 忽略。本文区分空组、空 key 组和非空组,并说明 TextHandler、JSONHandler 与自定义 Handler 的处理边界。250 收藏 -
解释 Go 文件写入、Sync 和 Close 的边界,给出临时文件替换与错误处理的可验证写法。249 收藏 -
Go 1.25 已将 testing/synctest 从实验能力带入标准库,升级到 Go 1.26 后应移除 GOEXPERIMENT=synctest,并把旧实验 API 改成正式包导入;本文用最小并发测试说明迁移、检查与回退边界。248 收藏