Go问答技术文章
-
使用 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 收藏 -
Go select 不会按 case 书写顺序保证优先级。本文用先探测高优先级 channel、再进入等待 select 的方式增加软优先级,并说明关闭、取消和严格优先级的边界。303 收藏 -
Go url.URL 的 Fragment 面向解码后的语义,RawFragment 只是可选的原始编码提示。本文说明如何用 EscapedFragment 和 String 保留片段中的百分号编码,分析直接拼接与直接改写 RawFragment 的边界,并给出解析、读取、修改和输出检查清单。370 收藏 -
Go select 在多个通信 case 同时就绪时会从可继续的分支中选择一个,case 的书写顺序不是优先级。本文解释 ready 集合、default、关闭 channel 和两层 select 的边界,并给出需要显式优先级时的仲裁迁移方式。209 收藏 -
Go 中 channel 无人关闭不一定等于内存泄漏,但 range 接收、发送阻塞和提前退出都会让 goroutine 长期存活。本文用 goroutine 栈定位阻塞点,并给出 ctx.Done、发送方关闭和复查清单。345 收藏 -
Go channel 的关闭责任应交给决定“不再发送”的生产者:单生产者完成发送后直接关闭,多生产者等待全部退出后由协调者只关闭一次。本文结合 context、WaitGroup 和 range,说明如何避免重复关闭、向已关闭 channel 发送以及 goroutine 泄漏。288 收藏