Go问答技术文章
-
Go 的 database/sql.Conn.Raw 会在回调期间暴露底层驱动连接,但这个对象只能在回调内使用。本文拆开回调边界、driver.ErrBadConn、连接归还池和 Conn.Close 的并发安全问题。196 收藏 -
Go template 报 function not defined 时,关键是把 Funcs 注册放到 Parse 前,并逐项检查模板函数名、文件解析入口、ExecuteTemplate 名称和函数签名。196 收藏 -
从 initialization cycle、全局变量为空和 init 启动异常入手,解释 Go initorder 背后的包级依赖规则,并给出最小复现、依赖排查和显式构造的修复方法。196 收藏 -
go fix 负责源码现代化修复,gofmt 负责标准格式化。本文从执行顺序、分析器依赖和构建配置三个角度解释连续运行产生不同 diff 的原因,并给出可重复的审阅流程。196 收藏 -
Go os.Pipe 的读端提前关闭后,写端继续写入可能得到 broken pipe。本文从两端关系、关闭时机、错误分类和子进程通信场景说明原因,并给出可复用的处理策略。196 收藏 -
在反射构造切片时,reflect.Value.Grow 可以提前保证追加空间,但它只接受可设置的 Slice Value,不改变切片长度。本文从批量映射场景出发,梳理 Grow 与 append、SetLen 的职责,以及 Kind、CanSet、负数参数和容量溢出的 panic 边界。196 收藏 -
Go 覆盖率统计到函数并不代表每个分支都执行。本文用表驱动测试区分包覆盖率、函数覆盖率和代码块报告,定位没有命中的分支。195 收藏 -
Go 读取标准输入遇到 io.EOF 通常表示输入自然结束,不是错误日志。本文用逐行读取和固定长度读取对比 EOF、真实 I/O 错误与 ErrUnexpectedEOF 的处理边界。195 收藏 -
Go sync.Mutex.TryLock 适合可选的最佳努力工作,不适合代替带超时的 Lock。本文解释成功与失败的同步语义、测试难点,以及如何用确定的同步结构保护核心业务。195 收藏 -
Go io.MultiWriter按顺序写入多个Writer,首个错误会截断后续目标。本文用故障示例拆解部分成功语义,并给出全量一致、尽力写入和可重试封装的处理边界。195 收藏 -
Go 测试的偶发失败不能只靠重复运行排查。本文区分测试数据种子与 go test 的 -shuffle 种子,给出局部 rand.Rand、顺序记录、CI 复现命令和诊断清单,并说明 map 迭代、并发调度与外部状态为何不能靠一个种子完全复现。195 收藏 -
go.mod replace 用于当前主模块替换某个依赖的内容来源,go.work 则把多个本地模块聚合为同一工作区的主模块集合。本文比较两者的生效范围、冲突规则、适用场景和发布边界,并给出 GOWORK=off 验证方法。195 收藏 -
Go 变量仍在作用域不等于对象仍然可达:函数参数或接收者可在最后一次提及后失去活性,weak.Pointer.Value 随后可能返回 nil。本文还原根因,并给出强所有者与 runtime.KeepAlive 的正确放置方式。195 收藏 -
time.Time.Round 不只是把纳秒取整:它按墙上时间计算,并会去掉单调时钟读数。因此原值与 Round 结果用 ==、Equal、Compare 比较时可能得到不同结论。本文用最小示例拆开三种语义,并给出测试断言和时间键的选择方法。195 收藏 -
解释 go test 的两种执行模式、(cached) 命中条件、count=1 对照方法和 go clean -testcache 的清理边界,帮助排查修改后结果不变。195 收藏