Go问答技术文章
-
json.Decoder 面向输入流读取下一个顶层 JSON 值,所以多个值可以连续 Decode。本文解释这种设计,并给出严格单值校验和流式读取的实用写法。118 收藏 -
Go 的 *string 字段在 JSON 缺失和显式 null 时都可能得到 nil,无法直接表达 PATCH 接口的三态语义。本文用自定义 UnmarshalJSON 类型保留字段是否出现、是否为 null 以及具体值,并说明复用结构体时的常见误判。315 收藏 -
Go 的 url.QueryUnescape 把加号解成空格是查询编码规则,不是字符串损坏。本文用对比例子说明查询参数、路径文本、QueryEscape 和错误处理应该如何配套使用。116 收藏 -
Go 的 URL.Path 保存解码后的路径,RawPath 只用于保留有效的原始编码提示;如果把已编码字符串直接放进 Path,URL.String 或 HTTP 客户端会再次转义百分号,形成 %252F。493 收藏 -
Go 的 HTTP 响应头必须在第一次 WriteHeader 或 Write 之前设置;本文用 handler 分支说明隐式 200、最终状态码、http.Error 与 trailer 的边界。424 收藏 -
ReadHeaderTimeout 保护请求头读取,WriteTimeout 限制响应写回,IdleTimeout 只管理 keep-alive 连接等待下一请求。本文按请求阶段比较三者的边界、重置规则和回退关系,并给出普通接口、慢上传与长响应的配置判断方法。266 收藏 -
解释 Go HTTP 客户端总超时与 Transport 阶段超时的覆盖范围,说明 DNS、TCP、TLS、响应头和响应体分别该由什么配置控制。499 收藏 -
Go 的 http.Client 返回响应后,Response.Body 不读取、不关闭,或每次新建 Client,都可能让 Transport 无法复用持久连接。本文用原创示例拆开 Body 生命周期、读取策略和连接池排查方法。489 收藏 -
Go 1.20 的 context.WithCancelCause 可以把具体错误随取消信号传给下游。本文区分 ctx.Err() 与 context.Cause(ctx),说明首个取消原因、父子 Context 传播和常见误用。170 收藏 -
context.WithCancel 的 cancel 不只是结束信号,也负责解除父子 context 关联。本文用 Go 代码说明不调用 cancel 时的泄漏边界、正确写法和排查清单。367 收藏 -
Go Timer.Reset 前处理旧事件的原因、Stop 与非阻塞 drain 的兼容写法,以及 Go 1.23 后同步定时器通道带来的版本边界。492 收藏 -
Go 1.23 之后,不调用 Ticker.Stop 不一定等于 ticker 内存泄漏;真正要排查的是 ticker 是否仍被引用、消费它的 goroutine 是否会退出,以及后台任务是否还在继续执行。480 收藏 -
Go 用 close(channel) 做退出广播很方便,但重复关闭会 panic。本文说明单一关闭者、sync.Once、只读通道和数据通道所有权之间的边界。144 收藏 -
Go channel 关闭后仍能接收,是因为关闭且排空的 channel 会立即返回元素类型零值;带 ok 的接收可以区分真实发送值和关闭信号。本文用最小示例说明缓冲排空、ok 判断与常见误区。115 收藏 -
Go select 一旦加入 default,就会在没有可通信 case 时立即返回;如果它被放进无条件循环,空闲路径就会变成忙轮询。本文说明如何判断、修复并保留必要的非阻塞语义。453 收藏