Go问答技术文章
-
Go HTTP 超时不能只看一条错误字符串:context deadline、http.Client.Timeout 和 Transport 阶段超时的触发范围不同。本文按请求边界、错误链和连接阶段给出区分方法。344 收藏 -
Go HTTP 请求应把 context 超时绑定到 Request,并在拿到响应后关闭 Response.Body;循环调用时复用同一个 http.Client,让 Transport 有机会复用持久连接。395 收藏 -
Go HTTP 请求超时后仍占资源,通常不是 context 取消失效,而是请求、响应体、连接复用和业务 goroutine 的清理职责没有分开。本文用可执行示例说明正确的取消与关闭方式。172 收藏 -
Go time.After 只能返回接收通道。本文用单次所有者模式解释 NewTimer 与 context 取消、Stop 清理、同时就绪及 Go 1.23 语义差异。231 收藏 -
在重复等待场景中,time.After 适合一次性超时;需要复用和动态调整时,应持有 time.NewTimer 返回的 Timer,并按 Go 版本选择正确的 Reset 与清理方式。214 收藏 -
使用 Go runtime/metrics 读取 runnable、running、waiting 与 live goroutine 指标,区分近似值和总量,并用连续采样判断运行队列压力,避免把单次高点误判为泄漏或根因。306 收藏 -
Go time.Time 用 == 比较时,Location 和单调时钟读数也可能参与比较。本文按调用方需求区分 Equal 与结构体比较,处理时区、序列化和精度边界。252 收藏 -
Go time.Time 序列化后失去单调部分是设计如此:单调时钟只对当前进程有意义,JSON、Gob、二进制和文本序列化都会省略它。本文拆解比较、相等判断与耗时统计的正确边界。228 收藏 -
Go time.Time 的单调读数会影响比较与相减,== 还比较 Location 和完整表示。本文用 JSON 往返与时间索引示例,区分 Equal、进程内计时和 UTC 规范化键,并解释精度丢失的排查方法。215 收藏 -
Go 循环中直接 defer 会把关闭动作推迟到外层函数返回。本文用逐个处理文件的场景,说明如何缩短 defer 生命周期,并用命名返回值保留 Close 错误。475 收藏 -
Go defer 写在循环里时,关闭动作通常要等所在函数返回。本文用一个批量读取小工具说明资源为何积累,并给出局部函数、错误合并与退出边界的改写方式。186 收藏 -
Go 1.23 不能直接 range 结构体,但可以让结构体方法返回 iter.Seq 或 iter.Seq2,再用 range over function 逐项迭代。本文用完整示例说明 yield、提前停止、双值迭代器与 go.mod 版本要求。133 收藏 -
Go defer 属于所在函数,循环结束不会触发延迟关闭。本文以批量文件读取解释资源积累原因,给出单文件助手函数与错误合并写法,并说明作用域、闭包和退出方式的区别。132 收藏 -
Go range 遍历结构体切片时,值变量只是元素副本;本文比较索引写回、指针字段修改和替换指针的写法,说明怎样避免改了却没有生效。372 收藏 -
Go range 遍历结构体切片时,第二个变量通常是当前元素的值副本,直接修改它不会回写原切片。本文用一个小型批处理示例说明原因,并比较按索引回写、指针遍历和只读副本的适用边界。351 收藏