Go 1.20, a planned upgrade to the Google-developed open source language known for its simplicity, concurrency, and functional programming features, has just reached a release candidate stage. The new version previews profile-guided optimization (PGO) for the compiler.
Announced December 7, the Go 1.20 release candidate can be downloaded from go.dev. The production release of Go 1.20 is expected in February 2023.
With Go 1.20, preview support for PGO enables the compiler toolchain to perform application-specific and workload-specific optimizations based on runtime profile data. The compiler currently supports pprof CPU profiles, which can be collected through the
net/http/pprof packages. Version 1.20 uses PGO to more-aggressively inline functions at hot call sites. Benchmarks for a representative set of Go programs show enabling PGO inlining optimization improves performance about 3% to 4%. More PGO optimizations are planned for future releases.
Go 1.20 also introduces four changes to the language. First, an improvement made in 2021’s Go 1.17 release—the ability to convert a slice to an array pointer—has been extended to allow conversions from a slice to an array, according to draft release notes.
unsafe package defines three new functions:
StringData. These functions provide the complete ability to construct and deconstruct slice and string values without depending on exact representation.
Third, the specification now defines that struct values are compared one field at a time, considering fields in the order they appear in the struct type definition and stopping at the first mismatch. And fourth, comparable types such as ordinary interfaces now may satisfy comparable constraints, even if the type arguments are not strictly comparable. This enables instantiation of a type parameter constrained by
comparable with a non-strictly comparable type argument such as an interface type, or a composite type containing an interface type.
Also with Go 1.20:
- The runtime adds experimental support for memory-safe arena allocation that makes it possible to eagerly free memory in bulk. This could improve CPU performance.
- Collection of code coverage profiles for programs is supported, including for applications and integration tests, as opposed to just unit tests.
- The directory
$GOROOT/pkgno longer stores precompiled package activities for the standard library. Instead, packages in the library are built as needed and cached in the build cache. This reduces the size of the Go distribution and avoids C toolchain skew for packages that use cgo.
- The implementation of
go test –jsonhas been improved to be more robust. Programs that run
go test -jsondo not need updates.
gocodecommand now defines architecture feature build tags.
gocommand now disables
cgoby default on systems without a C toolchain.
go version -mcommand now supports reading more types of Go binaries, most notably Windows DLLs built with
go build- buildmode=c sharedand Linux binaries without execute permission.
- Experimental support is added for FreeBSD on RISC-V.
- Go 1.20 is the last release that will run macOS 10.13 High Sierra or 10.14 Mojava. Go 1.21 will need macOS 10.15 Catalina or later.
Go 1.19, which improved generics and the memory model, was released August 2.