mirror of
https://github.com/golang/go.git
synced 2025-05-30 03:41:33 +00:00
This is the first round of TODOs created based on relnote todo output. There are many entries that need to be documented, expanded, reworded, and this change makes progress on setting that up. For this cycle, relnote todo implemented a simple heuristic of finding CLs that mention accepted proposals (see issue 62376, or comment https://go.dev/issue/62376#issuecomment-2101086794 specifically). The "Items that don't need to be mentioned in Go 1.23 release notes but are picked up by relnote todo." section in todo.md contains an attempt at reviewing that list. The large number of items needed to be reviewed made it impractical to spend much time on any individual one. For #65614. Change-Id: Id9d5f1795575a46df2ec4ed0088de07ee6075a90 Reviewed-on: https://go-review.googlesource.com/c/go/+/588015 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Carlos Amedee <carlos@golang.org>
33 lines
1.5 KiB
Markdown
33 lines
1.5 KiB
Markdown
### Timer changes
|
|
|
|
Go 1.23 makes two significant changes to the implementation of
|
|
[time.Timer] and [time.Ticker].
|
|
|
|
<!-- go.dev/issue/61542 -->
|
|
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.
|
|
|
|
<!-- go.dev/issue/37196 -->
|
|
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](/doc/godebug) [`asynctimerchan=1`](/pkg/time/#NewTimer)
|
|
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.
|