-
time.Time.Round 不只是把纳秒取整:它按墙上时间计算,并会去掉单调时钟读数。因此原值与 Round 结果用 ==、Equal、Compare 比较时可能得到不同结论。本文用最小示例拆开三种语义,并给出测试断言和时间键的选择方法。
-
Go 的 time.Parse 使用参考时间表达布局,-0700 代表无冒号的数值时区偏移模板,而不是固定的西七区。本文用输入对照和最小示例说明如何选择 -0700、-07:00 与 Z07:00。
-
多个 Go 实例首次启动时,如果只使用 O_CREATE 或先检查再创建,同一路径可能被重复打开并发生覆盖。本文用 O_CREATE|O_EXCL 把“谁能创建”变成一次性判断,并说明 os.ErrExist、写入失败清理和实现边界。
-
用 io.NewSectionReader 为大文件建立固定偏移和长度的只读视图,再通过 io.Copy、ReadAt 和 Seek 导出或读取指定区间,避免先把整个文件加载进内存。
-
Go io.CopyN 要求复制满指定字节数。本文用完整复制、源数据不足和目标写入失败三个场景,说明如何结合 written 与 error 做准确判断。
-
用 os.UserConfigDir 获取跨平台的用户配置根目录,再追加应用子目录和文件名;本文解释 Unix、Darwin、Windows、Plan 9 的目录规则,以及环境变量缺失时如何显式处理错误。
-
用 Go 的 utf8.DecodeRune 扫描可能含坏字节的 []byte 时,非法输入会返回 RuneError 和 size=1。本文用一个小型扫描器说明如何按 size 推进游标,避免重复读取同一字节造成循环不前,并覆盖空输入与混合输入边界。
-
Go csv.Reader 遇到列数不一致时,不要直接丢掉 Read 返回的 record。本文区分 FieldsPerRecord 的三种模式,演示如何捕获 ErrFieldCount、保存已解析异常行,并说明何时需要保留原始字节。
-
Go testing.T.Chdir 改的是整个测试进程的当前工作目录。本文用父子测试和 Cleanup 的嵌套场景,解释目录变化的可见范围、恢复顺序与并行限制,并给出更稳妥的测试组织方式。
-
Go encoding/csv 的 TrimLeadingSpace 只针对字段开始处的空白解析规则,本文用示例说明普通字段、空白分隔符与引号内空格的边界。
-
sync.OnceValue 会把初始化函数的返回值复用给后续调用,因此承载在返回值里的 error 也可能被持续复用。本文区分错误返回与 panic,给出显式重建 getter 和自定义可重试状态两种恢复策略,并说明并发交换与失败风暴边界。
-
sync.RWMutex 不支持把 RLock 升级为 Lock,读锁未释放时申请写锁会等待自己释放读锁而形成阻塞。本文用原创代码对比拆分读写临界区与直接使用单写锁的改造方案,并说明重新检查、锁复制和对象生命周期边界。
-
结构体里放入 sync.Mutex 后,按值传参、赋值或返回都会复制锁的内部状态,可能造成异常解锁、数据竞争和锁失去保护对象。本文从根因、错误写法、指针改造和 go vet copylocks 检查四个方面说明安全设计方式。
-
使用 sync.WaitGroup 收尾并发任务时,关键不是把 Wait 放在最后,而是保证任务计数先建立、空 WaitGroup 上的 Go 先于 Wait,并在复用前等上一轮 Wait 返回。本文对比 WaitGroup.Go 与 Add/Done 的调用顺序,给出一份可直接落地的并发收尾写法。
-
sync.Pool 取出的对象带着上一次请求的字段时,问题通常不是 Pool 失效,而是复用对象没有在交接边界清理。本文从临时对象契约、Reset 设计、Get/Put 时机和不适合放入 Pool 的状态四个方面,整理一套可落地的排查方式。