-
docker init 能快速生成 Go 项目的 Dockerfile、compose.yaml 和 .dockerignore,但生成结果只是起点。本文按构建版本、主程序路径、端口、运行用户和敏感文件五个边界,给出一份可落地的修改清单。
-
Go 的 slog.HandlerOptions.ReplaceAttr 会在 TextHandler 或 JSONHandler 输出前接收每个非 Group 属性。把 groups 与 Key 组合成完整路径后,可以集中执行全量替换、局部掩码或返回零 Attr 删除字段,并用缺失断言验证敏感原文没有进入日志。
-
子测试调用 t.Parallel 后,直接包住它的 t.Run 就可以返回,父测试函数继续执行;子测试在 Parallel 之后的部分会暂停到父测试函数返回后再恢复,但父测试整体仍要等全部子测试完成。本文同时说明 defer、t.Cleanup 和分组等待的区别。
-
slog.WithGroup 应该承担稳定的命名空间,而不是替代字段命名。本文对比嵌套组、空组和自定义 Handler 的边界,给出避免 request_id、status 等属性冲突的设计方法。
-
Go slices.SortedStableFunc 会把 iter.Seq 收集到新切片,再按比较器稳定排序;比较结果相等的元素保留原迭代顺序,空序列返回 nil。本文说明比较器写法、空结果边界,以及它与 SortStableFunc 的选择。
-
Go 1.23 起可用 slices.Backward 按降序索引反向遍历切片,无需复制或改变元素顺序。本文给出最小写法、提前停止、索引写回、结构体值语义、空切片和旧版本兼容示例。
-
Go 的 *sql.DB 是连接池句柄,*sql.Tx 才是当前事务上下文。事务开始后继续用 db.Query 或 db.Exec,语句可能落到另一条连接,无法共享未提交状态或随事务回滚。本文给出正确写法和排查清单。
-
Go 1.23 起可用 slices.Chunk 返回 iter.Seq,按固定大小惰性遍历连续子切片。本文用完整示例说明末尾短块、空输入、非法大小、容量裁剪、元素修改与批处理错误定位。
-
Go 的 rows.Scan 成功只说明当前行完成了类型转换,rows.Err 才能确认整个结果集迭代没有在 Next、网络或 context 取消处失败。本文给出可直接复用的处理模板和边界清单。
-
TLS 会话恢复是在新连接上复用先前会话状态以缩短握手,并不会复用旧 TCP 连接。本文区分 http.Transport 连接池与 ClientSessionCache,说明 Reused、DidResume 的观测方法和常见误判。
-
maps.EqualFunc 允许 Go 比较键类型相同但值类型不同的两个 map。本文用 string 与 []byte 的例子说明比较器写法,并梳理 nil、空 map、缺失键和不可比较值的边界。
-
maps.Keys 返回 map 键的 iter.Seq,但官方明确说明迭代顺序未指定,而且不同调用之间不保证一致。本文解释常见误区,并给出普通有序键、结构体键、测试与接口输出的稳定排序写法。
-
Go 的 x509.SystemCertPool 在 Linux、macOS、Windows 和容器中使用的信任来源与实现不同;Subjects 也不会完整枚举平台系统根,因此数量差异不等于验证能力差异。本文按故障时间线说明根因、排查与修复。
-
Go 中 InsecureSkipVerify=true 会跳过默认的证书链和主机名校验。若业务必须接管验证,应在 VerifyConnection 中用自定义 RootCAs、中间证书池和 DNSName 调用 x509.Verify,并可追加 SPKI 指纹约束。
-
Go 1.23 起,maps.Collect 可以把 iter.Seq2[K,V] 键值序列收集为新的 map。本文从 slices.All 的最小写法讲到自定义 Seq2、重复键覆盖规则,以及 maps.Collect 与 maps.Insert 的选择边界。