Go问答技术文章
-
通过 Go 的 os.LookupEnv 与 os.Getenv 示例,说明空字符串和未设置的区别,并给出配置回退、必填校验与测试隔离的实用写法。381 收藏 -
Go 1.24 新增 testing.B.Loop。本文用一个可运行的基准测试说明它和 b.N 写法的区别、计时边界、编译器保活语义,以及升级后如何核对结果。381 收藏 -
Go 1.24 的 os.OpenInRoot 如何安全打开不可信文件名?本文用目录逃逸、符号链接和错误分支说明 Root 的边界,并给出可核对的最小代码。381 收藏 -
slog.Logger 写日志前会先询问 Handler.Enabled。把昂贵的参数构造放到级别判断之后,可以避免被过滤的日志仍然消耗 JSON 序列化、查询和字符串拼接成本。381 收藏 -
t.Setenv 修改的是整个测试进程的环境变量,Cleanup 只负责结束后恢复,不能消除并行期间的共享状态。本文说明 t.Parallel 的直接与祖先冲突,并给出串行环境测试和显式配置注入的改法。381 收藏 -
Go race 检测器需要 cgo,并不代表自动覆盖 C 库内部全部访问。本文区分 Go 共享状态、C 库内部并发与跨语言指针生命周期,给出串行封装和最小测试命令,说明无报告的适用范围。381 收藏 -
Go 的 URL.Path 会保存解码后的路径,RawPath 只是可选的编码提示。本文用 %2F 场景解释 EscapedPath 何时采用 RawPath、何时忽略它,并给出解析和手动构造 URL 时的稳妥写法。381 收藏 -
Go 用 encoding/json 将 JSON 解码到 interface{} 或 map[string]any 时,数字默认会落成 float64。本文用订单金额和分页字段的例子说明这种行为的原因,演示 Decoder.UseNumber、json.Number 与结构体解码的选择,并给出精度验证与边界检查方法。380 收藏 -
Go internal 包能否导入,不是只看 go.mod 是否相同,而是看调用方是否位于 internal 父目录树内。本文用目录结构和最小示例解释失败原因,并给出移动目录、公开包和拆分模块的修复边界。380 收藏 -
从 go.mod 的 go 指令、完整模块图与裁剪模块图对比入手,定位 module graph pruning 暴露的依赖缺失,补足显式 require 并用 tidy、兼容检查和构建验证修复边界。380 收藏 -
用 Go 的 utf8.DecodeRune 扫描可能含坏字节的 []byte 时,非法输入会返回 RuneError 和 size=1。本文用一个小型扫描器说明如何按 size 推进游标,避免重复读取同一字节造成循环不前,并覆盖空输入与混合输入边界。380 收藏 -
GJSON 的 Exists 判断字段是否存在,空字符串判断的是字符串内容;缺失、null、空串和非空串并不是同一种状态。本文用一段最小 Go 示例说明四种状态的差异,并给出输入校验与审计时的选择方式。380 收藏 -
atomic.Uint64 适合维护并发计数,但一个已经使用过的值不能再通过复制传递。本文用请求计数器拆开 Add、Load、Store 和复制副本的边界,说明为什么会触发 go vet 警告,以及如何安全地初始化、读取和测试。379 收藏 -
多发送者写入同一个 Go Channel 时,关闭责任应由等待所有发送者结束的协调者承担;本文用 WaitGroup 和 Context 说明如何避免重复关闭、发送到已关闭 channel 以及 Goroutine 泄漏。379 收藏 -
Go modules 的 replace 适合本地联调、临时修复和 fork 迁移,但必须和 require 配对,并确认它只在当前主模块生效。本文用模块解析、依赖图、测试和发布清理四个检查点,整理一套可回滚的替换方案。379 收藏