blob: db42bc3e8f97c734d1b532821d9695c79656baf5 [file] [log] [blame] [view]
---
title: Go 1.20 is released!
date: 2023-02-01
by:
- Robert Griesemer, on behalf of the Go team
summary: Go 1.20 brings PGO, faster builds, and various tool, language, and library improvements.
---
Today the Go team is thrilled to release Go 1.20,
which you can get by visiting the [download page](/dl/).
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](/doc/pgo)
(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.
## Language changes
- The predeclared [`comparable`](/ref/spec#Type_constraints) constraint is
now also [satisfied](/ref/spec#Satisfying_a_type_constraint) by
ordinary [comparable types](/ref/spec#Comparison_operators), such as interfaces,
which will simplify generic code.
- The functions `SliceData`, `String`, and `StringData` have been added
to package [`unsafe`](/ref/spec#Package_unsafe). They complete the set of functions
for implementation-independent slice and string manipulation.
- Go's type conversion rules have been extended to permit direct conversion
[from a slice to an array](/ref/spec#Conversions_from_slice_to_array_or_array_pointer).
- The language specification now defines the exact order in which array elements
and struct fields are [compared](/ref/spec#Comparison_operators).
This clarifies what happens in case of panics during comparisons.
## Tool improvements
- The [`cover` tool](/testing/coverage) now can collect coverage profiles of whole programs,
not just of unit tests.
- The [`go` tool](/cmd/go) 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.
- The implementation of `go test -json` has been improved
to make it more robust in the presence of stray writes to `stdout`.
- The `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.
- The `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).
- The [`vet` tool](/cmd/vet) reports more loop variable reference mistakes
that may occur in tests running in parallel.
## Standard library additions
- The new [`crypto/ecdh`](/pkg/crypto/ecdh) package provides explicit support for
Elliptic Curve Diffie-Hellman key exchanges over NIST curves and Curve25519.
- The new function [`errors.Join`](/pkg/errors#Join) returns an error wrapping a list of errors
which may be obtained again if the error type implements the `Unwrap() []error` method.
- The new [`http.ResponseController`](/pkg/net/http#ResponseController) type
provides access to extended per-request functionality not handled by the
[`http.ResponseWriter`](/pkg/net/http#ResponseWriter) interface.
- The [`httputil.ReverseProxy`](/pkg/net/http/httputil#ReverseProxy)
forwarding proxy includes a new `Rewrite` hook function, superseding the
previous `Director` hook.
- The new [`context.WithCancelCause`](/pkg/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`](/pkg/context#Cause) function.
- The new [`os/exec.Cmd`](/pkg/os/exec#Cmd) fields [`Cancel`](/pkg/os/exec#Cmd.Cancel)
and [`WaitDelay`](/pkg/os/exec#Cmd.WaitDelay) specify the behavior of the
`Cmd` when its associated `Context` is canceled or its process exits.
## Improved performance
- Compiler and garbage collector improvements have reduced memory overhead
and improved overall CPU performance by up to 2%.
- Work specifically targeting
compilation times led to build improvements by up to 10%.
This brings build speeds back in line with Go 1.17.
When [building a Go release from source](/doc/install/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](/doc/go1.20).
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](/issue/new).
Enjoy Go 1.20!