Go语言技术文章
-
用 Go crypto/rand 读取固定长度随机字节时,区分 Reader 的短读语义、io.ReadFull 的完整读取保证与错误传播边界,并用可控测试替身复核实现。129 收藏 -
给 Go HTTP 接口限制请求体时,http.MaxBytesReader 超限并不会自动替处理器写完响应。本文用一个可运行的上传接口说明读取错误、状态码时机、连接收尾和测试验收应该怎样配合。218 收藏 -
Go slog 的 AddSource 能把日志调用点写进 source 字段,排查并发服务时很有用,但每条日志都要承担调用点定位和格式化成本。本文用可验证的基准与生产开关说明它的代价、适用范围和安全切换方式。192 收藏 -
从切片别名、append 扩容和底层数组保留三个角度,说明 Go slices.Clone 的适用边界,并用可运行示例验证复制后的修改、nil 语义与内存释放判断。126 收藏 -
Go 服务偶发变慢时,runtime/metrics 能把 GC 频率、暂停和堆目标放到同一组可采样指标里。本文从一次延迟抖动开始,说明如何选指标、对齐时间窗口,并排除把正常回收误判成 GC 压力。278 收藏 -
Go 的一次取值函数适合惰性初始化,但初始化函数一旦 panic,后续调用会再次 panic,而不是自动重试。本文拆开这个语义,给出可观测、可控的失败处理方案。152 收藏 -
Go 的 map range 顺序没有稳定保证,同一张 map 也不能把第一次遍历结果当成下一次的顺序。本文用一个最小示例说明随机化边界,并给出测试、日志和接口输出需要排序时的可靠写法。119 收藏 -
bufio.Scanner 返回 false 不一定代表文件读完了,长 token、SplitFunc 规则和 Err 检查都会改变结果。本文用可运行示例拆开这几个边界,并给出读取大行时的修复方式。454 收藏 -
Go 1.25 的 runtime/trace.FlightRecorder 能持续保留最近一段执行轨迹,在慢请求或健康检查异常时导出现场。本文用一个 100 毫秒慢请求阈值示例,说明 MinAge、MaxBytes、WriteTo 和 go tool trace 的配合边界。336 收藏 -
Go 写文件时,os.File.Sync 成功并不等于包含它的目录项也完成持久化。本文用临时文件、重命名和目录同步的完整流程,说明崩溃恢复时该看哪些边界。410 收藏 -
Go 1.25 将 testing/synctest 从实验功能带到标准库可用状态,本文用超时重试测试说明如何替换旧开关、检查虚拟时间语义并让 CI 稳定验收。245 收藏 -
Go 的 crypto/subtle.ConstantTimeSelect 适合在两个整数结果之间做常量时间选择,但它不能替代完整的密码学实现。本文从掩码、输入约束、编译验收和错误用法说明它的边界。244 收藏 -
context.WithoutCancel 适合让收尾任务忽略上游取消,但它不会自动提供超时、Done 或可用的 Deadline。本文用请求日志落盘和资源清理场景拆开它的边界,并给出可复现的回收与超时写法。189 收藏 -
Go 里读到 io.EOF 不等于所有 Reader 都永久失效。本文用 bytes.Buffer、文件和分块读取场景拆开 EOF 的含义,说明缓冲区复用时该看什么状态,以及如何避免把 EOF 当成普通错误。179 收藏 -
解释 Go 测试中 testing.TB.Cleanup 的执行时机,结合主测试、t.Run 子测试和并行测试,定位清理函数看似没有执行的常见原因。181 收藏