Go语言技术文章
-
context.WithCancel 的 cancel 不只是结束信号,也负责解除父子 context 关联。本文用 Go 代码说明不调用 cancel 时的泄漏边界、正确写法和排查清单。367 收藏 -
用 Go text/template 的命名模板和 ExecuteTemplate,让同一个 Report 数据对象输出纯文本与 Markdown,并说明 define、Parse、字段路径和 html/template 的边界。344 收藏 -
Go Timer.Reset 前处理旧事件的原因、Stop 与非阻塞 drain 的兼容写法,以及 Go 1.23 后同步定时器通道带来的版本边界。492 收藏 -
Go 1.23 之后,不调用 Ticker.Stop 不一定等于 ticker 内存泄漏;真正要排查的是 ticker 是否仍被引用、消费它的 goroutine 是否会退出,以及后台任务是否还在继续执行。480 收藏 -
用 Go embed 把默认 YAML 配置和 HTML 模板打进二进制,配合 fs.Sub、template.ParseFS 与外部配置覆盖,解决部署时漏带资源和路径写错的问题。180 收藏 -
Go 用 close(channel) 做退出广播很方便,但重复关闭会 panic。本文说明单一关闭者、sync.Once、只读通道和数据通道所有权之间的边界。144 收藏 -
用 Go 的 os.ReadDir 读取目录,按文件大小筛选普通文件,并通过大小与文件名双关键字得到稳定、可重复的排序结果。282 收藏 -
Go channel 关闭后仍能接收,是因为关闭且排空的 channel 会立即返回元素类型零值;带 ok 的接收可以区分真实发送值和关闭信号。本文用最小示例说明缓冲排空、ok 判断与常见误区。115 收藏 -
用临时名、冲突预检查和倒序移动日志实现 Go 批量重命名;同一文件系统内任意一步失败时恢复已完成的改名,并说明进程崩溃、并发和跨盘边界。240 收藏 -
Go select 一旦加入 default,就会在没有可通信 case 时立即返回;如果它被放进无条件循环,空闲路径就会变成忙轮询。本文说明如何判断、修复并保留必要的非阻塞语义。453 收藏 -
用 Go 的 filepath.WalkDir 遍历文件树时,如何跳过 .cache、.git 等隐藏目录但继续访问其他路径?本文给出处理 error、判断 DirEntry 和使用 fs.SkipDir 的最小写法,并说明 SkipAll、符号链接与根目录错误的边界。479 收藏 -
Go 从 nil channel 接收不会返回零值,而是永久阻塞。本文通过复现、状态对比和 select 场景,说明如何定位 nil channel,并用初始化、超时或退出信号修复等待无出口问题。291 收藏 -
Go 的 archive/zip 可以先读取 ZIP 中央目录,再用 FileHeader 元数据生成文件名索引,不必打开或解压每个条目。本文给出目录扫描、精确查找、目录项识别和资源关闭的完整做法。408 收藏 -
Go 发送到已关闭 channel 会直接触发 panic。本文从 close 语义、发送方所有权、多发送方汇合和取消信号四个角度说明如何安排关闭时机。386 收藏 -
Go 使用 compress/gzip 写文件时,gzip.Writer.Close 会补齐压缩流并写入 GZIP footer。本文用正确的资源关闭顺序解释 Flush、Close 和底层文件句柄的边界,避免生成无法完整解压的文件。271 收藏