Go语言技术文章
-
Go 流式处理最容易留下 goroutine 泄漏的地方,是只取消一端却没有唤醒另一端。本文用 context、io.Pipe、CloseWithError 和底层 ReadCloser 组合出一套双端退出方案。498 收藏 -
Go testing.T.Cleanup 的关键不是把回调写在哪里,而是看它注册到哪个测试作用域以及登记顺序。本文解释同一 T 上的 LIFO 规则、父子测试边界、资源依赖登记方式和并发注册的排查方法。498 收藏 -
Go test 中 -count=1 会绕过成功测试缓存并实际执行一次;-count=0 则把普通测试、基准和 fuzz seed 的运行次数设为零,不能用来验证测试逻辑。本文对比两者与 (cached)、测试二进制、Examples 和 CI 排查的关系。498 收藏 -
Go slog.HandlerOptions.Level 是日志最低级别门槛。本文用 TextHandler 和 JSONHandler 说明如何过滤 Debug,如何用 LevelVar 动态打开调试日志,并排查默认 logger、独立 logger 与性能开关不生效的问题。498 收藏 -
解释 Go testing.B.Loop 如何接管基准测试的迭代扩容、计时边界和防编译器消除职责,并说明 b.N 仍可在循环结束后用于自定义指标。497 收藏 -
Go 的 *sql.DB 是连接池句柄,*sql.Tx 才是当前事务上下文。事务开始后继续用 db.Query 或 db.Exec,语句可能落到另一条连接,无法共享未提交状态或随事务回滚。本文给出正确写法和排查清单。497 收藏 -
Go 的 os/exec.StdoutPipe 返回子进程标准输出的读取端,必须先完成管道读取再调用 Cmd.Wait。本文解释管道关闭、输出回压和等待顺序,并给出单路读取、双路消费与 Output 的选择方法。497 收藏 -
sql.Null[T] 的 V 字段即使在 Valid=false 时也必须持有类型 T 的 Go 零值,但这不代表数据库存了零值。本文说明 V、Valid 与 Value() 的语义,并给出避免误判 SQL NULL 的写法。497 收藏 -
Go runtime.GOMAXPROCS 改小后延迟变高,常见原因是可运行 goroutine 受限后排队等待;但在容器中设得过大又可能触发 CPU throttling。本文从 CPU 配额、调度并行度和尾延迟三条线说明如何判断参数边界。497 收藏 -
多个 Go 生产者不要争抢 close 权限:用独立停止信号让生产者退出,用 sync.WaitGroup 确认全部结束,再由唯一协调者安全关闭输出通道。497 收藏 -
Go 中目录名与 package 名不一致通常不会直接导致 import 失败:import path 负责定位目录,package 声明决定默认调用前缀。本文用最小结构拆解 undefined、路径错误和同目录多包名问题,并给出显式别名与 go list 排查方法。497 收藏 -
Go runtime.SetFinalizer 只能作为非内存资源释放的兜底,不能替代显式 Close。本文从 GC 触发时机、进程退出、循环引用、KeepAlive 和幂等关闭几个边界说明正确的资源生命周期设计。497 收藏 -
使用 Go slices.SortStableFunc 按结构体字段排序,掌握等值元素保序、多字段比较、降序规则与原地修改边界。496 收藏 -
Go 类型别名只是原类型的另一个名字,定义类型则创建独立类型;本文用类型身份、接收者和接口断言解释两者的方法集差异。496 收藏 -
迁移 Go 构建约束时,//go:build 与 // +build 必须表达同一条件;理解空格、逗号和多行的逻辑,再用 gofmt、go vet 和跨平台构建检查结果。496 收藏