Go语言技术文章
-
Go slog 想让 API logger 和后台任务 logger 使用不同最低级别,应分别创建 handler 和 HandlerOptions;固定阈值传 slog.Level,运行时调整使用各自的 slog.LevelVar。187 收藏 -
Go 普通 map 不能直接承受并发读写,运行时 panic 只是可能出现的表现。本文用一个小缓存说明 map 并发边界,比较 RWMutex 与 sync.Map,并把 go test -race 放进回归验收。354 收藏 -
用 Go log/slog 在请求入口统一绑定 trace_id、request_id 和路由字段,再通过 context 传到业务函数,保持 JSON 日志可检索并避开敏感数据泄露。322 收藏 -
Go 泛型接口报错时,关键不是调用语法,而是类型参数的实际方法集。本文用 Buffer 和 Sink 示例说明 T 与 *T 的差异、编译期断言及指针接收者的取舍。396 收藏 -
掌握 Go database/sql 的事务收尾方式:用 defer tx.Rollback 做失败兜底,所有操作走 sql.Tx,只有 Commit 返回 nil 才使用事务结果,避免提交错误被误判为成功。348 收藏 -
Go 泛型出现 cannot infer type 时,先判断类型参数是否出现在普通实参中,再用显式类型参数或调整函数签名完成修复。105 收藏 -
用 sql.NullString 扫描 nullable 文本,清楚区分数据库 NULL、空字符串和普通字符串,并说明批量读取、写回和接口映射中的常见坑。260 收藏 -
Go fuzz 测试一直产生新输入时,先区分覆盖率探索与输入域失控,再用 seed corpus、长度格式约束和固定 fuzz 预算缩小空间,让失败样本更快复现。124 收藏 -
Go database/sql 的 sql.Stmt 可以在重复 SQL 中复用。本文按 DB、事务和局部函数三种边界说明 PrepareContext、StmtContext 与 Close 的正确放置,避开反复 Prepare 和资源迟迟不释放。106 收藏 -
Go benchmark 每次运行结果差很多,通常不能只靠增加 -count 解决。本文从计时区间、go test 参数、机器隔离和 benchstat 比较四个方面,给出一套可重复的环境噪声控制方法。111 收藏 -
用 Go crypto/rand 生成固定长度的密码学随机字节,编码为 URL 安全令牌,并说明 rand.Read 与自定义 Reader 的错误处理差异。371 收藏 -
Go TestMain 没有 error 返回值,初始化失败时应先清理已创建资源,再用 os.Exit(1) 明确阻断测试;初始化成功则保存 m.Run 的退出码,清理后原样返回。130 收藏 -
Go test ./... 返回很快并不一定是测试没执行,本文区分本地目录模式与包列表模式,说明如何识别 (cached)、用 -count=1 强制重跑,并选择 GODEBUG 与 testcache 清理范围。444 收藏 -
Go 校验 HMAC 签名时,不要把十六进制或 Base64 文本当普通字符串比较。本文说明如何重新计算 MAC、解码签名并使用 hmac.Equal 比较,同时处理编码错误、长度边界和请求鉴权中的常见误区。387 收藏 -
用 sha256.New 配合 io.Copy 流式读取大文件,计算 SHA-256 摘要并处理字节数、读取错误与自定义缓冲区。168 收藏