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
Blog Index