Go问答技术文章
-
Go sql.DB.BeginTx 会用传入的 context 管理整个事务生命周期。上下文取消后 database/sql 会回滚事务,Commit 返回错误。本文区分事务上下文、语句上下文与安全收尾写法。431 收藏 -
os.DirFS 只保证交给操作系统的路径带有指定前缀,根目录内的符号链接仍可能指向外部。本文用最小项目说明成因,并给出 Go 1.24+ 的 os.Root.FS 改写方案。431 收藏 -
Go HTTP Trailer 位于消息体之后,字段名必须在首部提交前声明,本文用服务端响应和客户端请求示例说明正确时序、分块传输条件与常见排查方法。431 收藏 -
Go 的 BuildInfo.Settings 是按实际构建条件写入的稀疏键值列表,VCS 字段会因关闭 buildvcs、缺少仓库或工具、模块与仓库目录不匹配等情况而缺失。本文给出判断方法与容错读取代码。430 收藏 -
Nil UUID 是 RFC 定义的特殊 UUID,也是 Go 中 uuid.UUID 的零值,但它并不自动等于业务缺失。本文从实体主键、可选关联、API 与数据库边界给出可落地的判定和建模规则。430 收藏 -
filepath.WalkDir 遇到权限目录时,错误会通过回调参数传入,而不是自动跳过。本文区分入口访问失败与子目录读取失败,说明 d 和 err 的判断方式,以及 return nil、filepath.SkipDir 和原样返回错误的取舍。430 收藏 -
Go io.CopyBuffer 的第二个缓冲区参数传入非 nil 但长度为 0 的切片时,会在复制开始前直接 panic。本文区分 nil、零长度和可用容量三种状态,解释入口检查、WriterTo/ReaderFrom 快路径与安全修复方式。428 收藏 -
Go 的 x509 Verify 即使已加载根证书,也可能因 PEM 未解析、使用了不同 Roots、缺失中间证书或 CA 约束不成立而返回 unknown authority。本文用加载布尔值、签名关系和返回链数量逐层定位并修复。425 收藏 -
解释 Go 文件原子替换为什么仍会在异常重启后丢失,并给出文件 Sync、Rename 与父目录 Sync 的完整耐久写入顺序和可复用代码。423 收藏 -
Go 的 math.Round 明确定义为就近取整,恰好半数时远离零,因此 2.5 得 3、-2.5 得 -3。本文用边界测试对比 RoundToEven,并说明小数位与金额场景的选择。422 收藏 -
Go 的 Request.Body 是一次性读取流,307/308 重定向要保留原方法和请求体时,需要 GetBody 创建新的 body。本文说明 NewRequest 的自动填充、自定义 reader 的缺口和手动补齐方法。422 收藏 -
Go 1.27 已支持普通泛型方法,但接口方法仍不能声明自己的类型参数。本文用最小签名拆解报错来源,并给出工具链、go.mod、包级函数和适配器的选择方法。422 收藏 -
无缓冲 Channel 强调发送与接收的同步交接,有缓冲 Channel 用有限队列吸收生产者和消费者的短时速率差异。本文从阻塞条件、业务语义、容量估算、关闭责任和取消路径说明如何做选择。421 收藏 -
子测试调用 t.Parallel 后,直接包住它的 t.Run 就可以返回,父测试函数继续执行;子测试在 Parallel 之后的部分会暂停到父测试函数返回后再恢复,但父测试整体仍要等全部子测试完成。本文同时说明 defer、t.Cleanup 和分组等待的区别。420 收藏 -
Go exec.Cmd.Cancel 默认会直接 Kill 子进程。本文用自定义取消信号配合 WaitDelay,说明如何给子进程清理机会、限制管道等待,并正确判断取消后的错误边界。418 收藏