The Go Blog
Go 1.22 is released!
Today the Go team is thrilled to release Go 1.22,
which you can get by visiting the download page.
Go 1.22 comes with several important new features and improvements. Here are
some of the notable changes; for the full list, refer to the release
notes.
Language changes
The long-standing “for” loop gotcha with accidental sharing of loop variables
between iterations is now resolved. Starting with Go 1.22, the following code
will print “a”, “b”, and “c” in some order:
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
For more information about this change and the tooling that helps keep code from
breaking accidentally, see the earlier loop variable blog
post.
The second language change is support for ranging over integers:
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(10 - i)
}
fmt.Println("go1.22 has lift-off!")
}
The values of i
in this countdown program go from 0 to 9, inclusive. For more
details, please refer to the spec.
Improved performance
Memory optimization in the Go runtime improves CPU performance by 1-3%, while
also reducing the memory overhead of most Go programs by around 1%.
In Go 1.21, we shipped profile-guided optimization (PGO) for the Go
compiler and this functionality continues to improve. One of the optimizations
added in 1.22 is improved devirtualization, allowing static dispatch of more
interface method calls. Most programs will see improvements between 2-14% with
PGO enabled.
Standard library additions
-
A new math/rand/v2 package
provides a cleaner, more consistent API and uses higher-quality,
faster pseudo-random generation algorithms. See
the proposal for additional details. -
The patterns used by net/http.ServeMux
now accept methods and wildcards.For example, the router accepts a pattern like
GET /task/{id}/
, which
matches onlyGET
requests and captures the value of the{id}
segment
in a map that can be accessed through Request values. -
A new
Null[T]
type in database/sql provides
a way to scan nullable columns. -
A
Concat
function was added in package slices, to
concatenate multiple slices of any type.
Thanks to everyone who contributed to this release by writing code and
documentation, filing bugs, sharing feedback, and testing the release
candidates. Your efforts helped to ensure that Go 1.22 is as stable as possible.
As always, if you notice any problems, please file an issue.
Enjoy Go 1.22!
Next article: Routing Enhancements for Go 1.22
Previous article: Share your feedback about developing with Go