Go语言技术文章
-
Go 的 os.File.Close 会返回 error。本文按文件用途和错误阶段说明什么时候必须返回、什么时候可记录,并给出同时处理 Write、Flush、Close 的写法。172 收藏 -
Go 校验接口 HMAC 签名时,不要用普通字符串比较。本文用 crypto/hmac 和 hmac.Equal 说明摘要重算、编码边界、请求体一致性与常见排查方法。425 收藏 -
Go 的 os.ReadFile 面向普通文件,传入目录时出现错误通常是路径类型不匹配。本文解释 *os.PathError 的含义,并给出目录读取与错误判断的正确写法。254 收藏 -
用 Go log/slog 的 Logger.With 在请求入口固定 request_id、method 和 path,再把派生 Logger 传入服务层,让 JSONHandler 输出一致的请求属性,并避开全局污染与敏感字段泄露。149 收藏 -
Go 用 os.Stat 判断文件是否存在时,不能把所有非 nil 错误都当成不存在。本文区分缺失、权限不足和其他系统错误,并给出 errors.Is 的安全写法。471 收藏 -
Go 多子命令程序不要把参数全部注册到全局 flag.CommandLine。本文用 flag.FlagSet 为每个子命令划分参数、错误输出和校验边界,并给出可复用的实现骨架。245 收藏 -
Go 的 csv.Reader 把 FieldsPerRecord 设为负数后,不再检查每条记录的字段数量,适合列数可变的 CSV;本文同时说明它与正数、0 的区别,以及如何在业务层安全处理变长记录。342 收藏 -
Go 基准测试中,输入构造、缓存预热和被测循环不应混在同一段计时里。本文用 testing.B、ResetTimer、StopTimer/StartTimer 与 B.Loop 说明如何划清初始化时间和基准循环时间。398 收藏 -
Go 的 json.Decoder.Decode 成功一次不代表整个输入已经结束。本文用第二次 Decode 检查 io.EOF,区分额外 JSON 值与损坏尾部,并给出日志、灰度和回滚做法。212 收藏 -
用 testing.F 和 f.Add 写 Go fuzz 测试时,随机字节并不会自动符合业务格式。本文演示如何保留长度与位置变化,把输入映射到合法字符域,并拆分非法输入测试。210 收藏 -
Go 的 encoding/json 中,omitempty 不能按结构体零值隐藏普通 struct;本文解释原因,并给出指针与 omitzero 的选择方法。277 收藏 -
Go 的 testing.T.Setenv 会修改整个测试进程的环境变量。本文说明它为何不能用于并行测试,并给出串行清理、显式配置和子进程隔离的选择方法。388 收藏 -
Go 的 json.Unmarshal 复用结构体时,JSON 缺失字段不会自动清零,旧指针可能因此残留。本文用最小示例区分缺失、null 与对象合并,并给出安全处理方式。404 收藏 -
介绍 Go testing.T Cleanup 的登记方式、后进先出顺序、父子测试作用域和并行测试中的资源清理边界。127 收藏 -
Go 的 ResponseWriter 会在首个 Write 或 WriteHeader 时提交响应头,之后再修改 Header 或状态码通常不会生效。本文用 ServeHTTP 示例说明正确顺序、错误分支和特殊边界。107 收藏