Go问答技术文章
-
Go 的 time.After 适合一次性等待,但放进高频循环后会不断创建新的计时器,让任务堆积到更难观察的状态。本文从轮询任务出发,解释 time.After 的生命周期,给出可停止的 time.NewTimer 写法,并用计数和取消测试验收修复是否生效。437 收藏 -
filepath.Clean 只做路径字符串的词法规范化,不能判断用户是否有权访问某个目录。本文用 Go 示例拆开 Clean、Rel、IsAbs 与符号链接检查的边界。437 收藏 -
Go 关闭带缓冲 channel 后,已经写入缓冲区的元素仍会按顺序读完。本文用代码说明 close、ok、range 与零值判断的边界。436 收藏 -
Go 测试中的 testexit 不是常规公开参数。本文比较 os.Exit、runtime.Goexit、t.FailNow、t.SkipNow、TestMain 和 -timeout 的退出范围,帮助你把失败、跳过、进程退出与资源清理分开处理。436 收藏 -
Go 1.21 及以上的新代码通常优先用 slices.SortStableFunc;旧版本兼容或强依赖索引比较器时可保留 sort.SliceStable。本文对照两种比较器契约、迁移风险与稳定性断言。436 收藏 -
Go 程序用 os.CreateTemp 创建临时文件后,删除失败往往不是路径问题,而是文件句柄仍被占用。本文用一个可复现的导入场景拆开 CreateTemp、Close、Remove 的顺序,并说明 Windows 与 Unix 文件系统的行为差异、错误定位和安全清理写法。435 收藏 -
bytes.Reader.Seek 的负位置不是普通读取失败,而是偏移计算越过了起点。本文用可运行示例拆开 whence、offset、返回位置和错误处理边界,并说明为什么不能继续读取。435 收藏 -
解释 Go 表驱动并行测试为什么会读到同一个循环变量,给出 tc := tc 的兼容写法,并区分 Go 1.22 语义、浅复制和共享资源问题。435 收藏 -
Go archive/zip 的 Writer.Create 遇到同名路径不会覆盖,而会追加重复条目。本文用路径规范化、seen map 和待写集合,分别实现拒绝重复与最后一份生效两种方案。435 收藏 -
区分 Go 字符串的字节偏移、rune 数量和用户感知字符,给出按 rune 边界与按字节预算安全截断的修复写法。435 收藏 -
Go 服务里用 time.Ticker 做周期任务时,真正容易出问题的不是 tick 间隔,而是任务退出后计时器、goroutine 和下游资源没有一起收尾。本文用可复现的长期任务场景拆解 Stop 的边界、退出信号和复查方法。434 收藏 -
Go 1.25 新增的 sync.WaitGroup.Go 把 goroutine 启动与计数绑定起来。本文用批量任务示例讲清启动时序、Wait 边界、panic 约束和异常收口方式。434 收藏 -
Go 的 int 字段不能直接接收 JSON 字符串中的数字。固定返回 "123" 时使用 json:",string",同时兼容数字和字符串时用自定义 UnmarshalJSON 配合 strconv.ParseInt,并明确空值、小数和溢出策略。434 收藏 -
Go 的 panic 沿当前 goroutine 调用栈展开,recover 只有在同一 goroutine 的 deferred 函数中直接调用才会生效。本文用原创示例说明错误位置、保护函数和 channel 传递边界。434 收藏 -
Go 里把 WaitGroup.Add 写进 goroutine,会让 Wait 有机会在计数建立前先返回。本文用时序拆解根因,给出 Add、Done、Wait 的安全写法,并说明嵌套任务和 WaitGroup.Go 的边界。434 收藏