Go features by version

This is a summary of which major features appeared in which versions of Go.

Go is released every six months. Each major Go release is supported until there are two newer major releases. Critical problems are fixed by issuing minor revisions.

1.231.221.211.201.191.181.171.161.151.141.131.121.111.101.91.81.71.61.51.41.31.21.11.0

I also provide links to the proposals (𝗣) and commits (𝗖𝗟) for the features described. Check them out for motivation and implementation details.

1.23 / Aug 2024

For loops can range over iterator functions.
𝗣 61405 • 𝗖𝗟 557835, 584596

New iter package with iterator types.
𝗣 61897 • 𝗖𝗟 543319, 557836, 565935, 565937, 591096

Slice iterators in the slices package.
𝗣 61899 • 𝗖𝗟 568477, 595515

Map iterators in the maps package.
𝗣 61900 • 𝗖𝗟 586716

Timers and Tickers that are no longer referred to by the program become eligible for garbage collection immediately.
𝗣 61542 • 𝗖𝗟 512355

Avoid stale receives after Timers and Tickers Stop/Reset return.
𝗣 37196 • 𝗖𝗟 568341

New unique package provides facilities for canonicalizing values.
𝗣 62483 • 𝗖𝗟 574355

Release notes (+ interactive version)

1.22 / Feb 2024

Each iteration of the loop creates new variables to avoid accidental sharing bugs.
𝗣 60078 • 𝗖𝗟 532580

For loops can range over integers.
𝗣 61405 • 𝗖𝗟 510538, 538718

New math/rand/v2 package to work with random numbers.
𝗣 61716 • 𝗖𝗟 502495, 502497, 502498, 502499, 502500, 502505, 502506, 516857

HTTP routing patterns support methods and wildcards.
𝗣 61410 • 𝗖𝗟 526815, 526616, 528355, 530575, 530479, 530481, 530461, 552195

New go/version package to work with Go versions.
𝗣 62039 • 𝗖𝗟 538895

Release notes (+ interactive version)

1.21 / Aug 2023

New min and max built-ins calculate the smallest/largest value among arguments.
𝗣 59488 • 𝗖𝗟 496038, 496257

New clear built-in deletes all elements from a map or zeroes all elements of a slice.
𝗣 56351 • 𝗖𝗟 448076, 453395, 463075, 481935

New log/slog package provides structured logging with levels.
𝗣 56345 • 𝗖𝗟 477295, 484096, 486376, 486415, 487855, 508195

New slices package provides many common operations on slices.
𝗣 45955, 54768, 57348, 57433, 58565, 60091, 60546
𝗖𝗟 467417, 468855, 483175, 496078, 498175, 502955

New maps package provides several common operations on maps.
𝗣 57436 • 𝗖𝗟 464343

New cmp package to work with ordered types.
𝗣 59488 • 𝗖𝗟 496356

Profile-guided optimization (PGO) performs optimizations based on run-time profile information.
𝗣 55022

WebAssembly System Interface port.
𝗣 58141

Release notes

1.20 / Feb 2023

Allow conversion from a slice to an array.
𝗣 46505 • 𝗖𝗟 428938, 430415, 430475

Compare struct values one field at a time, in order of definition.
𝗣 8606 • 𝗖𝗟 237919, 237921

Comparable types may now satisfy comparable constraints, even if the type arguments are not strictly comparable.
𝗣 56548 • 𝗖𝗟 454575

Allow wrapping multiple errors.
𝗣 53435 • 𝗖𝗟 432898

A way to cancel a context.Context with a given error ("cause").
𝗣 51365 • 𝗖𝗟 375977

New international-friendly time format strings.
𝗣 52746 • 𝗖𝗟 412495

New crypto/ecdh package provides support for Elliptic Curve Diffie-Hellman protocol.
𝗣 52221, 56052 • 𝗖𝗟 398914, 450335

The go command now disables cgo by default on systems without a C toolchain.
𝗖𝗟 496356

Release notes

1.19 / Aug 2022

Revised memory model.
𝗣 50859

Soft memory limit on the total amount of memory Go uses.
𝗣 48409 • 𝗖𝗟 397018

Limit total GC CPU utilization to 50%, excluding idle time.
𝗖𝗟 353989

New atomic types in the sync/atomic package.
𝗣 50860 • 𝗖𝗟 381317

Support for links, lists, and clearer headings in doc comments.
𝗣 51082

Release notes

1.18 / Mar 2022

Generic programming using type parameters.
𝗣 43651, 45346

New debug/buildinfo package provides access to module versions and build flags embedded in executable files.
𝗣 39301 • 𝗖𝗟 353887

New net/netip package defines a better IP address type and helper functions.
𝗣 46518 • 𝗖𝗟 339309

go get no longer builds or installs packages.
𝗣 43684

Fuzzing.
𝗣 44551

Release notes

1.17 / Aug 2021

Allow conversion from a slice to an array pointer.
𝗣 395 • 𝗖𝗟 216424

The runtime/cgo package provides centralized facility for managing (c)go pointer handles.
𝗣 37033 • 𝗖𝗟 295369

Bug-resistant build constraints using the go:build directive.
𝗣 41184

Release notes

1.16 / Feb 2021

Embed files into the executable using the go:embed directive.
𝗣 41191 • 𝗖𝗟 243940, 243941, 243942, 243944, 243945, 243945

New runtime/metrics package introduces a stable interface for reading implementation-defined metrics from the Go runtime.
𝗣 37112 • 𝗖𝗟 247040, 247041, 247043, 247044, 247045, 247046, 247047, 247049

New io/fs package provides file system interfaces.
𝗣 41190 • 𝗖𝗟 243908

The io/ioutil package is deprecated.
𝗣 42026

Module-aware mode is enabled by default (GO111MODULE=on).
𝗣 41330

Build commands like go build no longer modify go.mod and go.sum by default.
𝗣 40728

Release notes

1.15 / Aug 2020

New time/tzdata package embeds the timezone database into a program.
𝗣 38017 • 𝗖𝗟 228101

Release notes

1.14 / Feb 2020

Allow embedding overlapping interfaces.
𝗣 6977 • 𝗖𝗟 187519, 191257, 214240, 217134

Goroutines are now asynchronously preemptible.
𝗣 24543 • 𝗖𝗟 201760, 201762

New hash/maphash package provides hash functions on byte sequences.
𝗣 28322 • 𝗖𝗟 186877

Release notes

1.13 / Sep 2019

Uniform and modernized set of number literal prefixes.
𝗣 19308

Permit signed integer values as shift count.
𝗣 19113

Error wrapping.
𝗣 29934 • 𝗖𝗟 163558, 176998

New crypto/ed25519 package implements the Ed25519 signature scheme.
𝗣 25355 • 𝗖𝗟 174945, 182698

Release notes

1.12 / Feb 2019

Maps are printed in key-sorted order.
𝗣 21095 • 𝗖𝗟 142737

Release notes

1.11 / Aug 2018

Modules as a way to manages dependencies.

WebAssembly port.

Release notes

1.10 / Feb 2018

go build maintains a cache of recently built packages.

go test caches test results and automatically runs go vet.

Release notes

1.9 / Aug 2017

Type aliases.
𝗣 18130

Monotonic clock in the time package.
𝗣 12914 • 𝗖𝗟 36255

New math/bits package for manipulating bits.
𝗣 18616 • 𝗖𝗟 36315

Concurrent map in the sync package.
𝗣 18177 • 𝗖𝗟 36617

Test helper functions in the testing package.
𝗣 4899 • 𝗖𝗟 38796

Parallel compilation.

Release notes

1.8 / Feb 2017

Ignore tags when converting a value from one struct type to another.
𝗣 16085 • 𝗖𝗟 30169, 30190, 30191

The garbage collector no longer considers arguments live throughout the entirety of a function.
𝗣 15843

Slice-related functions in the sort package.
𝗣 16721 • 𝗖𝗟 27321, 30088

Send HTTP/2 server pushes in the net/http package.

HTTP server graceful shutdown in the net/http package.
𝗣 4674 • 𝗖𝗟 32329

Context support in the database/sql package.

Release notes

1.7 / Aug 2016

New context package to work with deadlines and cancellation.
𝗣 14660 • 𝗖𝗟 20346, 20347

New net/http/httptrace package for tracing events within HTTP requests.
𝗣 12580 • 𝗖𝗟 22191

Sub-tests and sub-benchmarks in the testing package.
𝗖𝗟 18895, 18896

Release notes

1.6 / Feb 2016

HTTP/2 support in the net/http package.

Vendoring.

Release notes

1.5 / Aug 2015

Compiler and runtime are completely written in Go.

Concurrent garbage collector.

GOMAXPROCS is set to the number of available cores by default.

Internal packages.

go tool trace command for fine-grained tracing of program execution.

go doc command for building package documentation.

Release notes

1.4 / Dec 2014

For-range loop without variables.

Disallow method calls on **T.

go generate command for generating source code before compilation.

Release notes

1.3 / Jun 2014

Contiguous goroutine stacks.

Release notes

1.2 / Dec 2013

Any expression that explicitly or implicitly requires evaluation of a nil address is an error.

Full slice expression to specify both capacity and length when slicing.

New encoding package provides a set of standard encoding interfaces to build custom marshalers and unmarshalers.

New image/color/palette package provides standard color palettes.

Indexing operation in the fmt formatting specifications.

Release notes

1.1 / May 2013

Integer division by zero is a compile-time error.

Method values.

Race detector.

New go/format package provides a way for to access the formatting capabilities of the go fmt command.

New net/http/cookiejar package provides the basics for managing HTTP cookies.

Release notes

1.0 / Mar 2012

The first stable release.

Release notes

Inspired by What's in which Python.

★ Subscribe to keep up with new posts.