Go问答技术文章
-
Go 的 flag.Func 适合把重复出现的命令行参数交给同一个回调逐次处理,但默认值不会自动触发回调,回调返回错误还会改变 Parse 的结果。本文用可运行示例拆清调用次数、参数顺序与失败边界。120 收藏 -
Go runtime/trace 文件变大,通常不是压缩工具的问题,而是采集窗口覆盖了太长时间。本文用 trace.Start/Stop 缩短一次操作的采集范围,并介绍 Go 1.25+ FlightRecorder 的 MinAge、MaxBytes 与 WriteTo 用法。120 收藏 -
Go select 不会按 case 的源码顺序固定选择;多个通信同时可运行时会在可运行集合中做均匀伪随机选择。本文用两阶段探测、退避和指标记录,避免把随机选择误判成业务优先级。120 收藏 -
Go defer 不是把整条语句留到函数结束才解释:函数值和参数在登记时求值,真正调用在返回前发生。本文拆开值参数、闭包和命名返回值的时机差异。120 收藏 -
Go 的 sync.RWMutex 不支持从 RLock 原子升级到 Lock;持有读锁时申请写锁会等待自己释放读锁,本文用等待关系解释死锁,并给出释放后重取和拆分状态锁的修复写法。120 收藏 -
Go HTTP 服务端选择 ReadHeaderTimeout 还是 ReadTimeout,关键看是否要限制请求体的整体读取时间。本文按请求阶段、接口类型和回归场景拆开比较,并给出从整请求超时迁移到分层配置的清单。120 收藏 -
区分 Go HTTP 请求超时与 Transport 空闲连接回收,给出连接池参数、共享 Transport 和主动清理的排查方法。120 收藏 -
Go 的 PathEscape 与 QueryEscape 都能处理 URL 特殊字符,但服务端解析位置不同。本文用路径参数、查询参数和反向解析示例,说明编码边界、加号语义与测试方法。119 收藏 -
Golang · Go问答 | 3星期前 | 并发 · 日志 · 标准库 · go · 错误排查 · 异步日志 handler log/slog Go slog.Record.Clone 属性生命周期
slog.Handler 收到的 Record 可能携带共享属性存储。单份转发通常可直接传递,多份分发或异步保留时应调用 Record.Clone,本文用 fan-out 与异步队列场景说明修改、并发和生命周期边界。119 收藏 -
Go 的 Header.Get 返回空字符串时,先检查是否用 Header.Set 或 Header.Add 写入、是否把请求头和响应头对象混用了,以及是否直接向 map 写入了非规范化键。118 收藏 -
json.Decoder 面向输入流读取下一个顶层 JSON 值,所以多个值可以连续 Decode。本文解释这种设计,并给出严格单值校验和流式读取的实用写法。118 收藏 -
Go 自定义 UnmarshalJSON 时把原类型再次交给 json.Unmarshal,会触发方法递归。本文用别名类型切断回调,并给出栈帧、字段错误和半成品对象的排查清单。118 收藏 -
Go 中直接调用 io.ReadAll 会把 Reader 读到 EOF。面对没有可靠长度的 HTTP 响应,应先做 Content-Length 预检查,再用 LimitReader 多读一个字节识别超限,最后把关闭、错误和解析边界统一处理。118 收藏 -
Go select 加 default 可以做一次非阻塞检查,但不应把它直接放进无节制的循环。本文用状态返回、阻塞等待、ticker 和 context 取消四种边界,说明 default 的适用范围与常见误区。117 收藏 -
用户可控 URL 一旦进入 Go HTTP 客户端,字符串黑名单远远不够。本文从一次图片抓取接口的故障切入,拆解 scheme、端口、DNS 解析、私网地址和重定向的校验顺序,并给出可测试的最小实现边界。116 收藏