The Go Blog

Go 1.22 is released!

Eli Bendersky, on behalf of the Go team
6 February 2024

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 only GET 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