Go问答技术文章
-
Go 的 csv.Reader 遇到不等长字段时返回 ErrFieldCount,根因通常是 FieldsPerRecord 的固定字段数约束。本文解释 0、正数、负数三种配置的差异,并给出严格校验、容忍变长记录和按业务规则整形的实用写法。156 收藏 -
Go embed pattern 无匹配文件时,先按源码包目录定位资源,再恢复编译前的真实产物。结合包内目录示例说明空目录、隐藏文件、上级路径与构建流水线的修复取舍。156 收藏 -
sync.Once 的回调函数内部再次调用同一个 Once.Do 时不会被当作已完成调用,而是等待当前回调结束,因此会卡在同一把互斥锁上。本文拆解死锁原因并给出不重入的初始化写法。156 收藏 -
fmt.Errorf 中的 %w 不要求位于格式字符串末尾,关键是它要按格式动词与参数位置绑定到 error 操作数。本文解释 %w 与 %v、显式索引、多个 %w、Go 版本兼容以及 errors.Is 和 errors.As 的调用边界。156 收藏 -
围绕 Go database/sql 的 PrepareContext,说明 DB 级与事务级 Statement 的关闭边界、Context 的使用位置,以及循环和错误路径中的资源清理写法。156 收藏 -
Go 使用 RawStdEncoding 解码时出现填充错误,通常不是数据必须补等号,而是发送方和接收方采用了不同的 Base64 约定。本文用最小示例区分 StdEncoding 与 RawStdEncoding,并给出错误定位和测试边界。155 收藏 -
Go 出现 import cycle 时,问题不是 init 顺序,而是包依赖图已经形成闭环。本文从最小循环、共享类型下沉、消费方接口和组合根四个角度,整理一套可以长期维护的拆包方法。155 收藏 -
Go panic 不是另一种 error 返回值,而是会沿当前 goroutine 调用栈展开的控制流。本文说明 panic、defer、recover 与 error 的职责边界,以及如何只在明确边界处恢复并转换为错误。155 收藏 -
Zap 的 AddCallerSkip 不是修改日志内容,而是调整调用位置计算时跳过的栈帧数量。本文用包装器层数解释 skip 偏小、偏大和重构后的归因风险,并给出集中配置方式。155 收藏 -
Go go toolchain 看起来没有释放时,先区分命令进程与模块缓存。本文按工具链选择、GOMODCACHE、GOCACHE 和进程观察逐层排查,说明什么时候清理缓存,什么时候应该继续查启动器或 CI 任务。155 收藏 -
Go 收到信号后仍不退出,要区分通知送达、工作取消与 main 生命周期。本文说明缓冲信号通道、NotifyContext、stop、完成回执及有界等待,给出 Linux/macOS 的完整示例并明确超时退出的清理代价。154 收藏 -
Go range 遍历结构体切片时,第二个变量通常是当前元素的值拷贝,修改它不会写回原切片。本文用最小示例说明原因,并给出按索引写回、只读值变量和指针切片三种选择。154 收藏 -
Go text/template.ParseFiles 按文件基名建立模板名称,包级调用的根模板取第一个文件,方法调用还要注意 New 名称与 Execute 的关系。本文用多文件、同名覆盖和 ExecuteTemplate 示例固定调用边界。154 收藏 -
QueryContext 取消后连接仍显示存在,通常是连接被归还连接池而不是立即断开;只有 Rows 未关闭、驱动不响应取消或专用连接未 Close 时,才需要继续排查资源占用。154 收藏 -
crypto/rand.Read 正常情况下会填满切片且不返回错误;本文解释底层失败契约,并给出使用 io.ReadFull 安全丢弃不完整缓冲区的写法。154 收藏