This is a practical use of CL 577915, follow-up to CL 577835. Change-Id: Ibe7e2fa11b444afa1898dc6f6aba1512fe98f1fe Reviewed-on: https://go-review.googlesource.com/c/go/+/578195 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Jonathan Amsterdam <jba@google.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
1.5 KiB
Timer changes
Go 1.23 makes two significant changes to the implementation of [time.Timer] and [time.Ticker].
First, Timer
s and Ticker
s that are no longer referred to by the program
become eligible for garbage collection immediately, even if their
Stop
methods have not been called.
Earlier versions of Go did not collect unstopped Timer
s until after
they had fired and never collected unstopped Ticker
s.
Second, the timer channel associated with a Timer
or Ticker
is
now unbuffered, with capacity 0.
The main effect of this change is that Go now guarantees
that for any call to a Reset
or Stop
method, no stale values
prepared before that call will be sent or received after the call.
Earlier versions of Go used channels with a one-element buffer,
making it difficult to use Reset
and Stop
correctly.
A visible effect of this change is that len
and cap
of timer channels
now returns 0 instead of 1, which may affect programs that
poll the length to decide whether a receive on the timer channel
will succeed.
Such code should use a non-blocking receive instead.
These new behaviors are only enabled when the main Go program
is in a module with a go.mod
go
line using Go 1.23.0 or later.
When Go 1.23 builds older programs, the old behaviors remain in effect.
The new GODEBUG setting asynctimerchan=1
can be used to revert back to asynchronous channel behaviors
even when a program names Go 1.23.0 or later in its go.mod
file.