Go问答技术文章
-
Go 先用 filepath.EvalSymlinks 检查,再调用 os.Open,仍可能因检查与使用之间的 TOCTOU 竞态打开意外文件。本文区分 IsLocal、EvalSymlinks 与目录根约束,并给出 Go 1.24+ 的 os.OpenInRoot、os.Root 迁移写法。124 收藏 -
Go 的 math.Ilogb 返回浮点数的二进制整数指数,不是普通的 Log2 结果。本文从 2 的幂、非整数幂和 Frexp 对比入手,解释零、无穷大、NaN 的特殊返回值,并给出选择函数和封装边界。123 收藏 -
Go 1.20 起普通接口可满足 comparable,但受 any 约束的类型参数、附加方法与不可比较动态值仍有不同边界。结合集合示例区分编译错误、运行时风险与业务键设计。123 收藏 -
围绕路径参数错误解码,区分路径段和查询编码、URL.Path 与 RawPath,并用原创示例说明重复转义、加号变空格和忽略错误导致空结果的处理。123 收藏 -
Go PGO 可以用 go tool pprof -proto 合并多个 CPU profile,但合并本质是样本相加。本文说明如何统一采样窗口、处理不同工作负载的权重,并把 merged.pprof 接入 default.pgo 或 go build -pgo。122 收藏 -
Go test -cover 的高百分比不等于边界已覆盖。本文用一个输入校验例子,说明如何拆分分支矩阵、补齐错误路径,并用 coverprofile 找到真正漏测的位置。122 收藏 -
Go strings.Replacer 适合把多组固定文本替换规则集中管理。本文说明 NewReplacer 的成对参数、重叠键的顺序、Replace 与 WriteString 的选择,以及规则复用时的边界。122 收藏 -
Go binary 的整数解码应遵循协议字节序,而不是本机端序。通过固定字节与八字节头部示例说明字段宽度、偏移和完整读取,区分短读与端序错误,并解释编码回环为何不等于协议互通。122 收藏 -
Go html/template 解析多个文件或 define 命名模板后,可以用 Templates 遍历关联模板并读取 Name,再用 Lookup 检查某个名称是否存在。本文给出最小示例,并说明 ParseFiles 根名称、命名模板和 ExecuteTemplate 参数不一致时的排查顺序。122 收藏 -
Go Request.GetBody 为 nil 时,先区分重定向重放和应用层重试,再用可重复创建 Body 的请求工厂保证每次上传读取同一份数据。122 收藏 -
Go slog Handler的方法允许并发调用。本文以日志封装迁移为例,说明派生对象、共享写入器、原子错误计数与业务字段的边界,给出委托JSONHandler的完整示例和回归场景。122 收藏 -
Go工具链升级后出现编译、测试或运行行为变化时,固定源码和依赖,用新旧工具链建立对照,区分模块声明、兼容默认值与环境差异,并保存可复现的定位记录。122 收藏 -
通过 go env -json 导出指定环境字段,并用 Python 按键读取。说明退出码与 stdout、stderr 的分离,CGO_ENABLED 字符串判断、失败后保存策略,以及配置快照与环境还原的区别。122 收藏 -
用 json.RawMessage 暂存外层 JSON 中结构可变的 payload,先读取 kind 再选择 UserCreated 或 UserDeleted 等目标结构完成第二次解析,并区分未知类型、空字段和类型不匹配。121 收藏 -
Go 的 hash/crc64.Checksum 需要同时接收完整字节切片和由多项式生成的 Table。本文说明如何选择 ISO 或 ECMA、复用不可修改的 Table、计算 uint64 结果,并按固定宽度十六进制格式输出。121 收藏