Go问答技术文章
-
Go slog.Group 只传组名却看不到字段时,通常是空组被 Handler 忽略。本文区分空组、空 key 组和非空组,并说明 TextHandler、JSONHandler 与自定义 Handler 的处理边界。250 收藏 -
Go 1.27 支持具体类型泛型方法,但指针接收者的方法集和可寻址规则没有改变。本文用可编译与不可编译示例说明变量、map 元素、临时值、方法表达式和接口调用的限制。249 收藏 -
fs.Sub 只把 io/fs 的逻辑名称映射到子目录,不参与操作系统对符号链接的真实解析,因此不能把 os.DirFS 变成安全沙箱。本文用最小示例解释越界原因,并给出 Go 1.24+ 的 os.Root 做法。248 收藏 -
解释 Go parser.AllErrors 只会取消默认的同一行错误抑制和十条左右停止限制,并说明解析恢复为何仍会跳过或遮蔽部分语法问题。247 收藏 -
复用 gzip.Reader 时看到旧数据,通常不是 Reset 失效,而是把 Reader 内部状态、输入源位置和调用方输出缓冲混在了一起。本文用 Reset、EOF、ErrChecksum 与 Multistream 说明正确的复用边界。247 收藏 -
zip.NewReader 需要 io.ReaderAt 和压缩包总大小,HTTP 响应体却通常只能顺序读取。本文用 RangeReaderAt 把 HTTP Range 适配成随机读取,并说明 206、Content-Range、目录定位和错误边界。246 收藏 -
Go 的 url.QueryEscape 把空格编码成加号,是查询参数采用 application/x-www-form-urlencoded 兼容语义的正常结果。本文通过最小实验说明空格、加号和 %20 的区别,并对比 QueryEscape、PathEscape 与 url.Values.Encode。245 收藏 -
本文解释 cgo 中 C 代码为什么不能随意长期保存 Go 指针,并对比 runtime/cgo.Handle、runtime.Pinner 与 C 自有内存三种安全方案。245 收藏 -
从输出目标、上下文转义、危险 URL 和 template.HTML 信任边界对比 Go 的 html/template 与 text/template,给出迁移和选型清单。245 收藏 -
Go 标准库 uuid.Parse 接受大小写等多种文本形式,但解析后保存的是 16 字节 UUID 值,String 会统一输出 RFC 9562 定义的小写连字符形式。本文说明比较、存储、日志、签名与原文保留边界。245 收藏 -
Go 的 io.Copy 会优先使用源的 WriterTo 或目标的 ReaderFrom,只有没有快路径时才进入通用缓冲循环;CopyBuffer 主要解决缓冲复用与尺寸实验,手写循环则用于进度、限速、校验等新增语义。本文解释三者的分派、错误处理和基准边界。243 收藏 -
Go 的 sql.DB 是并发安全的连接池句柄,不是单条连接。本文从数据库总容量、服务副本数与 DBStats 指标出发,给出 MaxOpenConns 等参数的估算和校准方法。243 收藏 -
io.Copy 不一定走缓冲循环:它会优先调用 WriterTo 或 ReaderFrom。本文用调用顺序、CopyBuffer 边界和适配器示例说明自定义缓冲区为什么没有生效,以及如何正确控制这条路径。239 收藏 -
C 位于 Go 垃圾回收器的对象图之外,不能在 cgo 调用结束后随意保存普通 Go 指针。本文从 GC 可追踪性、固定内存和嵌套指针三个不变量出发,对比同步借用、复制到 C 堆、runtime.Pinner 与 runtime/cgo.Handle,并给出代码、风险表和审计清单。236 收藏 -
maps.DeleteFunc 可以在遍历同一个 map 时按条件原地删除。本文说明删除未到达条目的规范语义,并给出纯谓词、稳定顺序、回调副作用和并发访问的处理边界。236 收藏