title: Go 1.20 is released! date: 2023-02-01 by:
Today the Go team is thrilled to release Go 1.20, which you can get by visiting the download page.
Go 1.20 benefited from an extended development phase, made possible by earlier broad testing and improved overall stability of the code base.
We're particularly excited to launch a preview of profile-guided optimization (PGO), which enables the compiler to perform application- and workload-specific optimizations based on run-time profile information. Providing a profile to go build
enables the compiler to speed up typical applications by around 3–4%, and we expect future releases to benefit even more from PGO. Since this is a preview release of PGO support, we encourage folks to try it out, but there are still rough edges which may preclude production use.
Go 1.20 also includes a handful of language changes, many improvements to tooling and the library, and better overall performance.
comparable
constraint is now also satisfied by ordinary comparable types, such as interfaces, which will simplify generic code.SliceData
, String
, and StringData
have been added to package unsafe
. They complete the set of functions for implementation-independent slice and string manipulation.cover
tool now can collect coverage profiles of whole programs, not just of unit tests.go
tool no longer relies on pre-compiled standard library package archives in the $GOROOT/pkg
directory, and they are no longer shipped with the distribution, resulting in smaller downloads. Instead, packages in the standard library are built as needed and cached in the build cache, like other packages.go test -json
has been improved to make it more robust in the presence of stray writes to stdout
.go build
, go install
, and other build-related commands now accept a -pgo
flag enabling profile-guided optimizations as well as a -cover
flag for whole-program coverage analysis.go
command now disables cgo
by default on systems without a C toolchain. Consequently, when Go is installed on a system without a C compiler, it will now use pure Go builds for packages in the standard library that optionally use cgo, instead of using pre-distributed package archives (which have been removed, as noted above).vet
tool reports more loop variable reference mistakes that may occur in tests running in parallel.crypto/ecdh
package provides explicit support for Elliptic Curve Diffie-Hellman key exchanges over NIST curves and Curve25519.errors.Join
returns an error wrapping a list of errors which may be obtained again if the error type implements the Unwrap() []error
method.http.ResponseController
type provides access to extended per-request functionality not handled by the http.ResponseWriter
interface.httputil.ReverseProxy
forwarding proxy includes a new Rewrite
hook function, superseding the previous Director
hook.context.WithCancelCause
function provides a way to cancel a context with a given error. That error can be retrieved by calling the new context.Cause
function.os/exec.Cmd
fields Cancel
and WaitDelay
specify the behavior of the Cmd
when its associated Context
is canceled or its process exits.When building a Go release from source, Go 1.20 requires a Go 1.17.13 or newer release. In the future, we plan to move the bootstrap toolchain forward approximately once a year. Also, starting with Go 1.21, some older operating systems will no longer be supported: this includes Windows 7, 8, Server 2008 and Server 2012, macOS 10.13 High Sierra, and 10.14 Mojave. On the other hand, Go 1.20 adds experimental support for FreeBSD on RISC-V.
For a complete and more detailed list of all changes see the full release notes.
Thanks to everyone who contributed to this release by writing code, filing bugs, sharing feedback, and testing the release candidates. Your efforts helped to ensure that Go 1.20 is as stable as possible. As always, if you notice any problems, please file an issue.
Enjoy Go 1.20!