Go · Version History

Every release of Go.

I track every Go release here — from the open-source release in November 2009 and the Go 1 contract in March 2012 through the current line — with ship dates, the headline changes per version, and links to the upstream release notes. Go ships on a strict six-month cadence (February and August) and holds itself to the Go 1 compatibility promise: code written to the Go 1 spec is meant to keep compiling and running, release after release.

Current: Go 1.26.0 — released February 2026. Current as of June 2026.

Era & maintenance

Era

Early — Go 1.0–1.10, 2012–2018, the GOPATH years before modules
Modules — Go 1.11–1.20, 2018–2023, modules arrive and become default
Current — Go 1.21+, 2023 onward, generics matured and toolchain management

Support window

The Go team supports each major release until there are two newer major releases — in practice, roughly a year, since two minors ship per year. Only the two latest major releases get security and bug fixes (currently Go 1.26 and Go 1.25). Older releases still build and run, thanks to the Go 1 promise; they just stop receiving patches. The live policy is at go.dev/doc/devel/release.

The contract under every release

The Go 1 compatibility promise.

Go source written to the Go 1 specification is intended to compile and run unchanged across every Go 1.x release — so upgrading from, say, Go 1.21 to Go 1.26 should not break your code. The guarantee is at the source level: binaries are not portable across versions, so you recompile, but you should not have to rewrite. The team reserves the right to break compatibility for security fixes, for bugs where the spec and the implementation disagree, and for any code that reaches into package unsafe. That promise — documented at go.dev/doc/go1compat — is the load-bearing reason the Go ecosystem upgrades as smoothly as it does, and it began with Go 1.0 in March 2012.

Go version table

Version
Go 1.26
Current
Feb 10, 2026
Latest release. new now takes an expression; the Green Tea GC is on by default; go fix reborn as the home of the modernizers; new crypto/hpke and experimental SIMD.
  • Language: the new builtin now accepts an expression, so you can allocate and initialize a pointed-to value inline instead of in two steps; and a generic type may now refer to itself within its own type-parameter constraints.
  • Green Tea garbage collector on by default — a memory-locality-aware redesign that cuts GC overhead by roughly 10–40% on typical workloads.
  • cgo calls are about 30% faster, and the heap base address is randomized at startup as a hardening measure.
  • go fix reborn as the home of Go's modernizers — push-button upgrades of code to current idioms and APIs.
  • Adds the crypto/hpke package, an experimental SIMD surface (simd/archsimd), and goroutine-leak profiling.
  • Last release to run on macOS 12 Monterey.
  • Upstream release notes: go.dev/doc/go1.26.
Version
Go 1.25
Current
Aug 12, 2025
Container-aware GOMAXPROCS honoring cgroup CPU limits; testing/synctest graduates; experimental encoding/json/v2 and the opt-in Green Tea GC.
  • Container-aware GOMAXPROCS — on Linux the runtime now honors the cgroup CPU limit (a meaningful change under Kubernetes) and updates it live as the limit changes.
  • testing/synctest graduates from experiment — test concurrent code against a virtualized clock so time-dependent tests are fast and deterministic.
  • Ships an experimental encoding/json/v2 and an opt-in “Green Tea” garbage collector (made default the following release).
  • runtime/trace.FlightRecorder for lightweight, always-on tracing; DWARF 5 debug info; and sync.WaitGroup.Go.
  • Upstream release notes: go.dev/doc/go1.25.
Version
Go 1.24
Current
Feb 11, 2025
Full generic type aliases; tool dependencies in go.mod via go tool; a Swiss Tables map; os.Root; weak pointers; a FIPS 140-3 module.
  • Full support for generic type aliases — a type alias may now have its own type parameters.
  • Tool dependencies in go.mod — the tool directive and go tool track and run build-time tools without the old tools.go hack.
  • A faster, more memory-efficient map implementation built on Swiss Tables.
  • os.Root for directory-scoped filesystem access; weak pointers; testing.B.Loop benchmarks; and a FIPS 140-3 validated cryptographic module.
  • Upstream release notes: go.dev/doc/go1.24.
Version
Go 1.23
Current
Aug 13, 2024
Range-over-function iterators and the new iter package; the unique package for value interning; opt-in toolchain telemetry.
  • Range-over-function iterators (for x := range f) — the language foundation under the new iter package, letting any type expose a standard iteration protocol.
  • The unique package for canonicalizing (interning) comparable values to save memory.
  • Timer internals were restructured for correctness and lower overhead.
  • Opt-in toolchain telemetry, designed to be local-first and transparent.
  • Upstream release notes: go.dev/doc/go1.23.
Version
Go 1.22
Current
Feb 6, 2024
Per-iteration loop variables (the for-loop closure footgun, fixed); for range over an integer; enhanced http.ServeMux routing; math/rand/v2.
  • Per-iteration loop variables — each iteration of a for loop now gets its own copy of the loop variable, fixing the long-standing closure footgun where goroutines or deferred calls all captured the same variable.
  • for range now works over an integer (for i := range 10).
  • Enhanced http.ServeMux routing — method matching and wildcard path patterns in the standard library router, removing a common reason to reach for a third-party mux.
  • A new math/rand/v2 with a cleaner, faster API.
  • Upstream release notes: go.dev/doc/go1.22.
Version
Go 1.21
Current
Aug 8, 2023
Built-in min, max, clear; new slices, maps, cmp packages and log/slog; PGO goes GA; forward/backward toolchain compatibility.
  • Built-in min, max, and clear functions.
  • New standard-library packages built on generics: slices, maps, and cmp; plus structured logging via log/slog.
  • Profile-guided optimization (PGO) reaches general availability — feed a production CPU profile back to the compiler for measurable speedups on hot paths.
  • Forward and backward toolchain compatibility — the go line in go.mod plus a recorded GODEBUG history mean a project declares the language version it needs, and the toolchain honors it.
  • Upstream release notes: go.dev/doc/go1.21.

The toolchain-management line. Above: the Current era (Go 1.21+), where generics had landed and the go directive began managing toolchains automatically. Below: the Modules era (1.11–1.20), when modules arrived, became the default, and generics finally shipped in 1.18 — and, further down, the Early GOPATH years. The full arc is in the prose history below.

Version
Go 1.20
Modules
Feb 1, 2023
Wrapping multiple errors; a preview of profile-guided optimization; faster compilation and slice-to-array conversions.
  • Errors can wrap multiple errorserrors.Join and a slice form of %w let a single error carry several causes.
  • A preview of profile-guided optimization (PGO), which reached GA in Go 1.21.
  • Faster compilation and direct conversions from a slice to an array (or array pointer).
  • Upstream release notes: go.dev/doc/go1.20.
Version
Go 1.19
Modules
Aug 2, 2022
A soft memory limit (GOMEMLIMIT) for the GC; a richer doc-comment format with links and lists; jump-table switches.
  • A soft memory limit (GOMEMLIMIT) — the garbage collector targets a configurable heap ceiling, a big help in containers and on memory-constrained hosts.
  • A richer doc-comment format with links, lists, and headings rendered by go doc and pkg.go.dev.
  • Switches compiled to jump tables for faster dispatch.
  • Upstream release notes: go.dev/doc/go1.19.
Version
Go 1.18
Modules
Mar 15, 2022
Generics — type parameters arrive, the largest language change since Go 1. Also native fuzzing in go test and multi-module workspaces (go.work).
  • Generics: type parameters arrive — functions and types can be parameterized over types, constrained by interfaces. The largest language change since Go 1, and the end of a debate nearly as old as the language.
  • Native fuzzing built into go test — coverage-guided fuzzing as a first-class testing mode.
  • Multi-module workspaces (go.work) — develop across several modules at once without editing each go.mod.
  • Upstream release notes: go.dev/doc/go1.18.
Version
Go 1.17
Modules
Aug 16, 2021
A register-based calling convention for faster code; pruned module graphs; the //go:build constraint syntax.
  • Register-based calling convention — function arguments and results pass in registers rather than on the stack, a broad performance win.
  • Pruned module graphs make builds load fewer transitive dependencies.
  • The //go:build constraint syntax — a cleaner, tool-friendly replacement for the old // +build lines.
  • Upstream release notes: go.dev/doc/go1.17.
Version
Go 1.16
Modules
Feb 16, 2021
The embed package bakes files into binaries; modules on by default; the io/fs abstraction; the Apple Silicon (darwin/arm64) port.
  • The embed package (//go:embed) — compile static files directly into the binary, so a server can ship as a single self-contained executable.
  • Modules on by default (GO111MODULE=on) — the GOPATH-based build mode is no longer the default.
  • The io/fs file-system abstraction (the fs.FS interface), which embed implements.
  • The Apple Silicon port arrives (darwin/arm64).
  • Upstream release notes: go.dev/doc/go1.16.
Version
Go 1.15
Modules
Aug 11, 2020
Smaller binaries and a faster linker, plus a GOPROXY fallback list.
  • A substantially rewritten linker producing smaller binaries and linking faster, especially on large programs.
  • GOPROXY may now be a comma-separated fallback list, so a private proxy can fall through to the public one.
  • Upstream release notes: go.dev/doc/go1.15.
Version
Go 1.14
Modules
Feb 25, 2020
Modules declared ready for production; asynchronously preemptible goroutines; defer becomes nearly free.
  • Go modules declared ready for production — the team recommended migrating projects off GOPATH.
  • Asynchronously preemptible goroutines — the scheduler can now interrupt tight loops with no function calls, removing a class of latency and deadlock surprises.
  • defer became nearly free in common cases, removing the last reason to avoid it on hot paths.
  • Upstream release notes: go.dev/doc/go1.14.
Version
Go 1.13
Modules
Sep 3, 2019
Module downloads default to the proxy and checksum database; new number-literal syntaxes; error wrapping (%w, errors.Is/As).
  • Module downloads default to the Go module proxy and checksum database (proxy.golang.org and sum.golang.org) — reliable, verifiable dependency fetching.
  • New number-literal syntaxes: binary (0b), octal (0o), hexadecimal floats, and digit separators (1_000_000).
  • Error wrapping — the %w verb plus errors.Is and errors.As for inspecting wrapped error chains.
  • Upstream release notes: go.dev/doc/go1.13.
Version
Go 1.12
Modules
Feb 25, 2019
TLS 1.3 support and smoother module ergonomics.
  • TLS 1.3 support in crypto/tls, on by default.
  • Smoother module ergonomics on the road from the 1.11 preview toward the on-by-default default in 1.16.
  • Upstream release notes: go.dev/doc/go1.12.
Version
Go 1.11
Modules
Aug 24, 2018
Go modules arrive (preview) — the dependency system that ended the GOPATH era — plus an experimental WebAssembly (js/wasm) port.
  • Go modules arrive (preview) — versioned dependencies declared in go.mod, the system that ended the GOPATH era and made reproducible builds the default story.
  • An experimental WebAssembly port (js/wasm), letting Go compile to run in the browser.
  • Upstream release notes: go.dev/doc/go1.11.
Version
Go 1.10
Early
Feb 16, 2018
A build cache and automatic test caching make incremental builds much faster.
  • A build cachego build caches compiled packages, so incremental builds skip work that hasn't changed.
  • Automatic test cachinggo test reuses results when nothing relevant changed.
  • Upstream release notes: go.dev/doc/go1.10.
Version
Go 1.9
Early
Aug 24, 2017
Type aliases; monotonic clock readings in time; the math/bits package; parallel function compilation.
  • Type aliases (type A = B) — added to support large-scale codebase refactoring, such as moving a type between packages without breaking callers.
  • Monotonic clock readings folded into time.Time, so durations stay correct across wall-clock adjustments.
  • The math/bits package for bit-counting and rotation intrinsics; the compiler now compiles a package's functions in parallel.
  • Upstream release notes: go.dev/doc/go1.9.
Version
Go 1.8
Early
Feb 16, 2017
Sub-millisecond GC pauses; faster compilation; sort.Slice; graceful HTTP server shutdown.
  • Sub-millisecond GC pause times — the concurrent collector's worst-case stop-the-world pauses dropped below a millisecond on typical workloads.
  • Significantly faster compilation.
  • sort.Slice for sorting a slice with a less-function, and graceful HTTP server shutdown (Server.Shutdown).
  • Upstream release notes: go.dev/doc/go1.8.
Version
Go 1.7
Early
Aug 15, 2016
The context package joins the standard library; a new SSA compiler backend produces faster binaries; sub-tests land.
  • The context package moves into the standard library — cancellation and deadline propagation across API boundaries, now idiomatic everywhere.
  • A new SSA-based compiler backend for amd64 produces smaller, faster binaries.
  • Sub-tests and sub-benchmarks (t.Run) for table-driven testing.
  • Upstream release notes: go.dev/doc/go1.7.
Version
Go 1.6
Early
Feb 17, 2016
HTTP/2 on by default, and vendoring becomes the default for dependencies.
  • HTTP/2 on by defaultnet/http transparently negotiates HTTP/2 over TLS for both client and server.
  • Vendoring becomes the default — the vendor/ directory mechanism for pinning dependencies is enabled without a flag.
  • Upstream release notes: go.dev/doc/go1.6.
Version
Go 1.5
Early
Aug 19, 2015
The compiler and runtime are now written entirely in Go (no more C); a concurrent GC with sub-10ms pauses; GOMAXPROCS defaults to the CPU count.
  • Self-hosting toolchain — the compiler and runtime are now written entirely in Go (with a little assembly); the last of the original C implementation is gone.
  • A concurrent garbage collector with target pause times under 10 milliseconds — a landmark for latency-sensitive services.
  • GOMAXPROCS now defaults to the number of CPUs, so programs use all available cores out of the box.
  • Upstream release notes: go.dev/doc/go1.5.
Version
Go 1.4
Early
Dec 10, 2014
The runtime is largely rewritten from C to Go; go generate arrives; internal packages land; official Android support is added.
  • The runtime largely rewritten from C to Go — the groundwork that made the fully self-hosting toolchain of Go 1.5 possible, and that let the GC become precise.
  • go generate arrives — a standard way to run code generators as part of the build.
  • Internal packages (internal/) let a module hide implementation packages from outside import; official Android support is added.
  • Upstream release notes: go.dev/doc/go1.4.
Version
Go 1.3
Early
Jun 18, 2014
Contiguous, growable goroutine stacks; sync.Pool; a faster garbage collector.
  • Contiguous, growable goroutine stacks — replaced the old segmented stacks, removing the “hot split” performance cliff.
  • sync.Pool for reusing allocated objects and reducing GC pressure; a faster, more precise garbage collector.
  • Upstream release notes: go.dev/doc/go1.3.
Version
Go 1.2
Early
Dec 1, 2013
Three-index slice expressions; goroutine preemption at function calls; a test-coverage tool.
  • Three-index slice expressions (s[low:high:max]) — control a slice's capacity, not just its length.
  • Goroutine preemption at function-call boundaries, so a tight loop calling functions can no longer starve the scheduler indefinitely.
  • A test-coverage tool integrated into go test -cover.
  • Upstream release notes: go.dev/doc/go1.2.
Version
Go 1.1
Early
May 13, 2013
Broad performance gains, method values, and a stronger race detector.
  • Broad performance gains — the first release after Go 1 focused heavily on making everything faster, often 30–40% on real programs.
  • Method values (binding a method to its receiver as a first-class function value).
  • A stronger race detector for catching data races in concurrent code.
  • Upstream release notes: go.dev/doc/go1.1.
Version
Go 1.0
Early
Mar 28, 2012
The first stable release; the Go 1 compatibility promise begins here.
  • The first stable release. Go 1 froze the language and standard library and published a specification that subsequent releases agree to honor.
  • The Go 1 compatibility promise begins here — the source-level guarantee that has held across every release since (see the compatibility document).
  • Upstream release notes: go.dev/doc/go1.
Version
Pre-1.0
Early
2007 – 2012
The origin: created at Google in 2007, open-sourced November 2009, then the r-tagged releases and weekly snapshots up to the Go 1 contract. Included for historical completeness.

Go was created at Google starting in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson, and was announced and open-sourced on November 10, 2009. The pre-1.0 era used r-tagged releases (roughly r56 through r60) and weekly snapshots, and the language and standard library changed freely — there was no compatibility guarantee yet.

The Go 1 contract (March 28, 2012) is what froze the language and library and began the compatibility-promise era. These releases are listed for historical completeness, not ongoing relevance; nothing here receives updates, and none of it is what you would install today.

Click any row to expand. Each row has a stable id for sharing — e.g. /software/go/versions/#go-1-26, #go-1-21, #go-pre-1-0. The full download archive and per-release notes live at go.dev/dl and go.dev/doc/devel/release.

Born at Google (2007) and open-sourced (November 2009)

Go began at Google in 2007 as a reaction to the day-to-day friction of building large systems in C++ and Java: glacial build times, sprawling dependency graphs, and concurrency primitives that felt bolted on. Its three original authors — Robert Griesemer, Rob Pike, and Ken Thompson — set out to design a language that compiled fast, read clearly, and made concurrency a first-class idea rather than a library. The result keeps a deliberately small feature set, leans on goroutines and channels for concurrency, and treats fast compilation as a design constraint, not an afterthought.

Go was announced and open-sourced on November 10, 2009. The mascot — the Go gopher, drawn by Renée French — arrived with it and became one of the most recognizable logos in the language world. For its first two and a half years Go was a moving target: the pre-1.0 releases changed the language and standard library freely, which made the eventual stabilization all the more consequential.

The Go 1 contract (March 2012)

Go 1.0 shipped on March 28, 2012, and with it came the document that has shaped every release since: the Go 1 compatibility promise. The guarantee is precise. Source code written to the Go 1 specification is intended to compile and run unchanged on every later Go 1.x release. The promise is at the source level — binaries are not portable across versions, so you recompile — but you should not have to edit working code to move forward a version.

What the promise reserves is as important as what it grants. The team may break compatibility to fix security problems, to correct cases where the specification and the implementation disagree, and for any program that reaches into package unsafe and depends on implementation details it was never promised. Everything else is meant to keep working. That single contract — documented at go.dev/doc/go1compat — is why upgrading the Go toolchain across a decade of releases is, for most codebases, an uneventful afternoon rather than a migration project. It is the load-bearing reason the ecosystem trusts the upgrade path.

The modules saga

For its first several years Go had no built-in dependency versioning. Code lived under a single GOPATH workspace, imports resolved by directory path, and there was no notion of “which version” of a dependency you were building against. That worked at small scale and broke painfully at large scale, which is why the community filled the gap with tools — godep, glide, and eventually the semi-official dep, which used a manifest-and-lock model familiar from other ecosystems.

The decisive turn came from Russ Cox, whose vgo proposal argued for a different model built on minimal version selection and an import-compatibility rule. It was controversial — it set aside much of dep's design — but it became the basis for Go modules, which arrived as a preview in Go 1.11 (2018), gained the proxy and checksum database in Go 1.13 (2019), and became the default in Go 1.16 (2021). The go.mod / go.sum pair, the public module proxy at proxy.golang.org, and the checksum database at sum.golang.org together ended the GOPATH era and made reproducible, verifiable builds the default.

Generics, at last (1.18, 2022)

Generics were the longest-running open question in Go's design. From the language's earliest days, the absence of parametric polymorphism was the most-cited complaint — and for just as long the team resisted, unwilling to add a feature that compromised readability or compile speed. The breakthrough was the type-parameters design: functions and types can declare type parameters, and those parameters are constrained by interfaces that describe the operations the code needs (including a new ability for an interface to list concrete types as a constraint set). After more than a decade of proposals and rejected designs, generics shipped in Go 1.18 in March 2022 — the largest change to the language since Go 1 — and the standard library began growing generic helpers (slices, maps, cmp) in Go 1.21.

The six-month cadence and toolchain management

Since the Go 1.x line settled, Go has shipped two major releases a year — one in February and one in August — a predictable rhythm that tells you exactly when to expect the next version. Each release is supported until two newer majors exist, so security and bug fixes flow to the two latest lines. The cadence is deliberately boring, and that is the point.

Go 1.21 (2023) added forward and backward toolchain compatibility, which changed how versions are managed in practice. The go line in a go.mod now declares the minimum language version a module requires, a recorded GODEBUG history preserves old default behaviors so an upgrade doesn't silently change semantics, and the toolchain can automatically download and switch to the version a project asks for. The upshot: a repository pins the Go version it expects, and the local go command honors it without anyone juggling installs by hand.

Go on WebAssembly and WASI

Go's WebAssembly story started in Go 1.11 (2018) with the experimental js/wasm port, which compiles Go to run inside a browser's JavaScript host. That covers front-end and browser-embedded use, but it ties the binary to a JavaScript environment. The second chapter is the WASI port: Go 1.21 (2023) added wasip1 support for the WebAssembly System Interface, letting Go programs run in standalone server-side Wasm runtimes (Wasmtime, Wasmer, and friends) with access to a sandboxed system interface rather than a browser. Together they let one language target both the browser and the emerging server-side Wasm platform.

Is there a Go 2?

For a while the team talked about “Go 2” as a banner for the bigger changes under consideration — generics, a possible new error-handling syntax, and other experiments. In the end that thinking was folded back into the Go 1 line and delivered incrementally: generics landed in 1.18, error wrapping in 1.13, and the various error-handling syntax proposals were debated and ultimately set aside rather than shipped as a breaking release. The practical answer is simple. There are no Go 2 releases. The version numbers keep climbing inside the Go 1 series — 1.24, 1.25, 1.26 — and the Go 1 compatibility promise still holds. Whatever “Go 2” once meant has arrived a feature at a time, without ever breaking the contract from 2012.

Find your version — in the terminal

The browser cannot detect what version of Go is installed on your machine. Run one of these in your terminal to see your real install.

What's installed?

Print the active toolchain version and its target platform.

$ go version                            # e.g. go version go1.26.0 darwin/arm64
$ go env GOVERSION                       # just the version string
$ which go                               # where the binary lives
$ go env GOROOT                          # the toolchain's install root

Pin a project to a Go version

The go directive in go.mod declares the version a project needs; since Go 1.21 the toolchain reads it and can switch automatically.

# go.mod
module example.com/app

go 1.26.0

# or edit it from the command line
$ go mod edit -go=1.26.0

An optional toolchain line in go.mod can request a specific toolchain, which the go command will download and run on demand.

Install or upgrade

Download from the official archive, fetch a specific version with the golang.org/dl helper, or use a package manager.

# Official downloads (all platforms)
$ open https://go.dev/dl/

# Fetch a specific version as a side-by-side binary
$ go install golang.org/dl/go1.26@latest
$ go1.26 download
$ go1.26 version

# macOS (Homebrew) — newest stable
$ brew install go

Manage multiple Go versions

Keep several Go versions side by side — the golang.org/dl helpers, or a polyglot version manager.

# One side-by-side binary per version
$ go install golang.org/dl/go1.25@latest # then: go1.25 download
$ go install golang.org/dl/go1.24@latest # then: go1.24 download

# gvm — the Go Version Manager
$ gvm install go1.26.0
$ gvm use go1.26.0 --default

# asdf / mise (polyglot version managers)
$ asdf install golang 1.26.0
$ mise use go@1.26

Sources: go.dev/doc/devel/release (the canonical release list); the per-release notes at go.dev/doc (go1.N); the Go 1 compatibility document; the Go blog; and the download archive at go.dev/dl. Current as of June 2026.

Mungomash LLC · More software pages

Last updated 2026-06-27 by Hyperion — new page.