主要观点:Go 1.23 包含了基于通道的定时器的新实现,有两个重要变化,会有两个可观察到的副作用,可能影响生产行为或测试。
关键信息:
- 新实现可使未停止且不再被引用的定时器和计时器可被垃圾回收,避免资源泄漏,定时器通道变为同步(无缓冲),
t.Reset
和t.Stop
方法有更可靠保证。 - 新实现仅在
main
包所在模块的go.mod
声明go 1.23
或更晚时使用,GODEBUG setting
可强制使用旧语义或新语义。 - 之前
cap
为 1,len
表示是否有值等待接收,Go 1.23 中cap
和len
始终为 0,应使用非阻塞select
代替len
polling 定时器通道。 - Go 1.23 前短间隔定时器会因调度延迟导致通道准备接收时间变长,Go 1.23 不受此影响,测试中需注意此类问题。
- 若程序或测试在 Go 1.23 失败但 Go 1.22 正常,可使用
asynctimerchan
设置检查是否是新定时器实现导致,还可使用bisect
工具找出具体代码。
重要细节: - 示例中展示了不同情况下的代码示例,如使用
len
polling 定时器通道的错误方式和正确方式,以及测试中如何处理定时器与其他通道的竞争等。 bisect
工具的使用示例,通过不断切换新定时器实现的启用和禁用,找出导致失败的具体代码位置和变化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。