Go问答技术文章
-
Go Pond v2 的 Stop 是单向生命周期操作:停止任务池后,新的 Submit 不再被接受,并通过 ErrPoolStopped 返回结果。本文说明停止边界、并发提交时序、错误处理方式,以及需要继续接收任务时如何创建新池。264 收藏 -
go-audio/wav 的 PCMBuffer 和 FullPCMBuffer 都能读取 WAV 样本,但前者由调用方控制批次和内存,后者一次性聚合全部 PCM。本文从内存上涨的故障症状出发,说明两种方法的触发条件、循环写法和选择清单。264 收藏 -
Go 的 log.Fatal 会先输出日志,再调用 os.Exit(1)。os.Exit 立即结束进程,不执行当前调用链中的 defer,因此清理逻辑会被跳过。本文拆开调用关系,并给出把错误返回到 main、让资源先完成 defer 的写法。263 收藏 -
Go HTTP 客户端拿到响应后如果没有关闭 Response.Body,连接可能无法按预期复用,连续请求时会出现等待、变慢甚至连接资源耗尽。本文按请求体生命周期、连接复用和并发封装给出排查与修复方法。263 收藏 -
xml.Decoder.Token 匹配不上 XML 元素,通常不是前缀写错,而是把前缀当成了命名空间值。本文用 Go 代码说明如何按 Space 与 Local 正确匹配,并在批量解析中减少格式化和无意义复制。263 收藏 -
Go 无缓冲通道发送和接收必须同时就绪。若同一个 goroutine 先发送再接收,或接收方提前退出,发送与接收就可能一起等待。本文按现场信号区分正常同步、双端阻塞、nil 通道和关闭通道,并给出可退出的修复方式。262 收藏 -
Go 使用 go:embed 报 pattern no matching files 时,重点检查声明文件所在包目录、模式拼写、模块边界和构建标签,而不是运行时工作目录。本文给出一套能定位到具体文件的排查方法。262 收藏 -
io.Copy 把正常 EOF 视为成功结束,零字节复制可以返回 nil。结合临时文件示例,区分空文件、末尾偏移与受限输入,并说明非空判断、复制数量和目标收尾的职责。262 收藏 -
讲清 Go io/fs 中 FileInfo.Mode、ModeDir 与 IsDir 的关系,并比较 DirEntry、Stat、Lstat 在目录类型判断中的使用边界。262 收藏 -
Go 关闭 channel 触发 panic,通常是关闭责任没有收口:nil channel、重复关闭和向已关闭 channel 发送分别对应不同的生命周期错误。本文用发送方所有权、协调者收口和接收端 ok 判断整理排障与迁移边界。262 收藏 -
Go 升级后 bufio.Scanner 的分行结果、token 数量或错误表现发生变化时,先固定工具链和输入,再核对 SplitFunc、Buffer、Bytes 生命周期与 Err 结果,避免把输入边界误判为版本回归。262 收藏 -
Go sync.RWMutex 的 RLocker 会把读锁能力适配为 sync.Locker:调用 Lock 实际执行 RLock,调用 Unlock 实际执行 RUnlock。本文用通用组件、读写生命周期和边界示例说明怎样安全复用它。261 收藏 -
Go 服务从终端切换到脚本或服务管理器后,相对路径可能因为工作目录变化而失效。本文用 os.Getwd 确认现场,在启动阶段用 filepath.Abs 固定路径,并说明为什么不应在运行中随意 os.Chdir。261 收藏 -
netip.Addr 中的 192.0.2.1 与 ::ffff:192.0.2.1 可能指向同一个 IPv4,但前者是 IPv4、后者是 IPv4 映射 IPv6,因此直接比较不会相等。本文用最小复现解释 Is4、Is4In6、BitLen 与 Unmap 的关系,并给出 map 键和回归测试的处理方式。261 收藏 -
Go 的 Mutex 首次使用后不能复制。值接收者、结构体赋值和返回值都可能产生锁副本;如果副本仍指向同一底层数据,就会出现多个锁保护同一对象的并发风险。260 收藏