Go语言技术文章
-
测试 HTTP Handler 时,httptest.NewRequest 会按服务端请求语义填充 URL、Host、TLS 和 ContentLength。本文用路径、绝对 URL、HTTPS 与请求体四组样本,拆开检查请求目标边界,避免把客户端请求和服务端请求混在一起。349 收藏 -
当一个 Go 类型同时靠方法集实现文本编码或 JSON 编码时,json.Marshal 会先看 MarshalJSON,再考虑 encoding.TextMarshaler;nil 指针又有单独的保护规则。本文用最小示例拆开调用优先级、指针接收者和嵌套字段边界。349 收藏 -
用 Go crypto/tls 的 GetCertificate 配合 atomic.Pointer 保存不可变证书快照,实现不改动 tls.Config 的最小化证书轮换,并厘清并发读取、加载失败和旧连接的边界。349 收藏 -
Go select 同时命中多个 case 时不会按源码顺序固定执行,而是在可通信的 case 中做均匀伪随机选择。本文用最小示例解释规则,并给出优先级、取消和测试的确定性处理方式。349 收藏 -
用明确的 Go 包路径配合 go test -race,只检查目标包的竞态测试;同时区分 -run、./...、依赖编译和 -count=1 的作用边界。349 收藏 -
Go 自定义测试 helper 没有调用 testing.TB.Helper() 时,失败日志容易指向工具函数内部。本文说明 Helper 的正确位置、多层包装与并发边界,让错误行号回到业务测试调用处。349 收藏 -
从 ns/op、B/op 和 allocs/op 三个指标出发,解释 Go 小对象分配、size class 与 tiny allocator 对基准测试解读的影响,并给出可重复的对照方法。349 收藏 -
big.Int.SetBytes 的契约是把输入解释为无符号大端整数,因此不会读取符号位。需要负数时,应由协议明确符号字段,或按固定字节宽度自行解析二进制补码。349 收藏 -
Go 1.22 改掉了 for 循环变量在闭包里容易共用同一个变量的老坑,但迁移时仍要看 go.mod 版本、旧兼容逻辑、go vet 提示和并发测试。本文用旧语义、新写法和回归清单说明怎么判断代码是否还能保留手动复制。348 收藏 -
Go 的 time.Duration 本质是 int64 纳秒数。本文用具体换算、溢出判断和定时器示例说明,为什么长时间配置会变成负数,以及如何在进入 time.NewTimer 或 time.After 前拦住错误值。348 收藏 -
用 Go runtime.SetFinalizer 说明终结器的触发条件、KeepAlive 的必要性、显式 Close 与终结器兜底的边界,并给出可运行的资源生命周期示例。348 收藏 -
bytes.FieldsSeq 从 Go 1.24 开始提供按 Unicode 空白切分字节串的单次迭代器。本文对比 bytes.Fields,解释 subslice、空白边界、迭代提前停止和底层字节切片生命周期。348 收藏 -
Go 1.27 的 go test 默认启用 stdversion vet,会按 go.mod 的 go 指令和文件构建条件检查标准库符号是否超出兼容版本。本文用 slices.Values 说明告警来源、修复选择和 CI 验收边界。348 收藏 -
掌握 Go database/sql 的事务收尾方式:用 defer tx.Rollback 做失败兜底,所有操作走 sql.Tx,只有 Commit 返回 nil 才使用事务结果,避免提交错误被误判为成功。348 收藏 -
Go 的 testing.T.Helper 没有返回值,它用于标记测试辅助函数,让失败日志跳过辅助层并更接近真正的测试调用位置。本文用原创示例说明调用位置、失败报告、并发边界和核对方法。348 收藏