Go问答技术文章
-
围绕 Go database/sql Tx 讲清异常路径统一回滚的写法:用 defer 兜底、事务内统一使用 Tx、正确处理 Commit 错误,并给出资源释放检查清单。448 收藏 -
Go 使用 os.File 更新配置或状态文件时,先在同目录临时文件中完整写入并 Sync,再关闭文件并 Rename,既避免半文件,也能清楚区分原子替换与断电持久化边界。448 收藏 -
Go 使用 sql.NullString 扫描可空文本列时,必须同时判断 String 和 Valid。本文用表格、代码和排查清单说明如何区分 NULL、空字符串与普通文本,并正确写回数据库。447 收藏 -
Go 使用 json.Decoder 时,io.EOF 通常表示输入流已经正常结束,不等于 JSON 格式错误。本文用代码区分 EOF、空输入、UnexpectedEOF 和真正语法错误。444 收藏 -
Go test ./... 返回很快并不一定是测试没执行,本文区分本地目录模式与包列表模式,说明如何识别 (cached)、用 -count=1 强制重跑,并选择 GODEBUG 与 testcache 清理范围。444 收藏 -
讲清 Go sync.WaitGroup 的计数快照、Add 与 Wait 的竞态边界,以及动态派生任务和 WaitGroup.Go 的安全用法。441 收藏 -
Go embedding 的字段冲突要先看选择器路径:同层同名会产生歧义,外层同名会隐藏嵌入字段,而方法提升还要单独检查签名与显式调用路径。本文用最小示例说明如何定位并修复。438 收藏 -
Go 子切片 append 后原切片内容被改写,通常是因为子切片仍有足够 cap,append 复用了同一个底层数组。本文用 len、cap、三索引切片和复制方案说明如何判断与隔离。438 收藏 -
Go 测试中的 testexit 不是常规公开参数。本文比较 os.Exit、runtime.Goexit、t.FailNow、t.SkipNow、TestMain 和 -timeout 的退出范围,帮助你把失败、跳过、进程退出与资源清理分开处理。436 收藏 -
Go archive/zip 的 Writer.Create 遇到同名路径不会覆盖,而会追加重复条目。本文用路径规范化、seen map 和待写集合,分别实现拒绝重复与最后一份生效两种方案。435 收藏 -
Go 项目已经生成 vendor,编译却仍访问模块代理,通常不是 vendor 目录失效,而是 -mod 参数、GOFLAGS、go.mod 版本门槛或 vendor/modules.txt 不一致。本文按检查顺序给出定位和修复方法。433 收藏 -
Go 的 UnmarshalJSON 适合处理 JSON 表示与 Go 类型之间的边界,不应承载数据库、权限或完整业务校验。本文用别名类型、临时结构和错误分层说明如何限定自定义解码责任。433 收藏 -
Go CGO 交叉编译出现 exec gcc not found 时,先确认目标平台、CGO_ENABLED 和 CC,再在目标 C 交叉编译器与关闭 CGO 之间选择,最后用二进制架构检查避免误用主机 gcc。432 收藏 -
从 Go string 与 C char 指针的表示差异出发,说明 C.CString、C.GoString、C.GoStringN 的选择、C.free 的释放责任,以及异步保存指针时的生命周期边界。432 收藏 -
竞态修复后吞吐下降不一定是锁竞争。本文用 mutex profile、block profile 和固定基线,判断新增临界区是否真正造成吞吐损失。430 收藏