Go语言技术文章
-
Go 的 io.SectionReader 会把读取限制在指定区间内。本文说明越界短读的原因、Read 与 ReadAt 的偏移差异,以及如何用 ReadFull 和 n/err 处理固定长度与尾部数据。399 收藏 -
Go 1.27 的 jsontext.Decoder.ReadValue 在对象或数组结束标记处返回 SyntacticError,并不会推进读取状态。本文区分结束 Token、真正的 io.EOF 和语法错误,说明如何用 PeekKind 与 ReadToken 安全处理流式 JSON 边界。399 收藏 -
Go archive/zip 的 File.Open 返回解压后的条目内容并负责校验,File.OpenRaw 则返回 ZIP 内保存的原始压缩字节。本文比较两者的资源、错误和用途边界,演示如何安全导出原始数据。399 收藏 -
Go 的可选时间字段不要只靠一个特殊日期来猜。本文对比 time.Time 零值、*time.Time 的 nil 语义和显式 Valid 包装,说明它们在判断、JSON 编解码与持久化边界上的适用场景。399 收藏 -
url.ParseQuery 只负责把 URL 编码查询串解析成内存中的 url.Values,不会打开文件、连接或响应体。本文用错误返回值、资源拥有者和运行时指标拆分排查路径,定位真正未释放的请求体、响应体、文件、连接或 goroutine。399 收藏 -
Go 的 URL 转义不要只看函数名:路径段使用 PathEscape,查询参数交给 url.Values。本文用斜杠、加号和空格说明两者的边界,并给出可复用的往返处理流程。399 收藏 -
以 google/uuid 为例,解释大写和无连字符输入的解析结果,区分原始文本与 UUID 值,并提供兼容规范化、严格格式和错误处理示例。399 收藏 -
Go 的 encoding/ascii85.Decode 不负责识别 Adobe 的 <~ 与 ~> 外层符号。本文用一个严格的单块解析函数先校验并剥离包络,再处理 flush、返回值和 CorruptInputError,最后比较它与直接解码、流式 NewDecoder 的适用边界。399 收藏 -
Golang · Go问答 | 21小时前 | net/http · Go问答 · 文件上传 Go 临时文件 maxmemory multipart/form-data ParseMultipartForm MaxBytesReader
Go ParseMultipartForm 的 maxMemory 不是整个上传请求的总大小上限。它主要控制文件内容在内存中的预算,普通字段和元数据还会占用额外内存,超出的文件内容可能写入临时文件。本文说明如何叠加 MaxBytesReader 限制 Body,并在处理完成后用 Form.RemoveAll 清理临时文件。399 收藏 -
Go jsontext 遇到无效 Token 时,先区分输入字节、Token 构造和 Decoder 当前语法状态,再用 PeekKind、ReadToken、ReadValue 与 WriteToken 缩小范围,保存偏移和最小复现样本。399 收藏 -
Go 1.21 的 log/slog 提供了 NewLogLogger,把旧式 log.Logger 的 Output 调用桥接到结构化 Handler。本文用 HTTP 服务迁移场景说明级别映射、属性保留、前缀与迁移边界,并给出可回归的日志核对方法。398 收藏 -
WaitGroup 本身没有超时参数。本文用完成通知实现可超时等待,再区分 Context 取消与直接放弃等待,避免把调用方超时误判成任务已停止。398 收藏 -
用 testing.M 的 TestMain 管理测试包级初始化和统一清理,再用 t.Cleanup 隔离单个测试资源,避免测试结果被清理逻辑覆盖。398 收藏 -
Go 中 context.Err 只能说明上下文因取消还是 deadline 结束,不能代替下游函数自己的 error。本文用 WithCancelCause、Cause 和错误映射示例,拆开判断上游取消、超时与下游失败。398 收藏 -
Go 基准测试中,输入构造、缓存预热和被测循环不应混在同一段计时里。本文用 testing.B、ResetTimer、StopTimer/StartTimer 与 B.Loop 说明如何划清初始化时间和基准循环时间。398 收藏