Go Tutorial · Go Basics · Lesson 9 of 30
Go History & Versions
Why three Google engineers designed Go, the Go 1 compatibility promise, every important release from Go 1.0 to 1.27 on one timeline (including generics), and which version to use today.
How Go started
In September 2007, three engineers at Google, Robert Griesemer, Rob Pike and Ken Thompson (co-creator of Unix and the B language), started sketching a new language on a whiteboard while waiting for a large C++ program to compile. Their frustrations were concrete: slow builds, complicated dependency management, and languages that made it hard to use multicore processors and write networked servers.
Their answer was Go: a small, statically typed, compiled language with fast builds, garbage collection, a simple syntax that is quick to learn, and built-in concurrency through goroutines and channels. Go was released as an open-source project on 10 November 2009, and Go 1.0 followed on 28 March 2012. Its gopher mascot was drawn by Renée French.
Go 1.0 came with the Go 1 compatibility promise: programs written for Go 1 keep compiling and running with every later Go 1.x release. That is why Go is still on version 1.x after more than a decade, and why the language has grown slowly and carefully. Go now powers much of the cloud: Docker, Kubernetes, Terraform and Prometheus are all written in Go.
Timeline of important releases
Go ships two releases a year, in February and August. Each release is supported until two newer releases exist, so roughly one year.
- Go 1.27Current
- Generic methods: methods can declare their own type parameters
encoding/json/v2arrives and now backsencoding/json; post-quantum signatures incrypto/mldsa
- Go 1.26Supported
new(expr)creates a pointer to a value:new(yearsSince(born))- The Green Tea garbage collector on by default (10–40% less GC overhead); a rewritten
go fixwith "modernizers"
- Go 1.25End of life · Aug 2026
- Container-aware
GOMAXPROCS,testing/synctest,sync.WaitGroup.Go; experimental Green Tea GC and JSON v2
- Container-aware
- Go 1.24End of life · Feb 2026
- Generic type aliases, faster maps based on Swiss tables,
os.Rootfor safe file access,testing.B.Loop
- Generic type aliases, faster maps based on Swiss tables,
- Go 1.23End of life · Aug 2025
- Range over functions (iterators) and the
iterpackage
- Range over functions (iterators) and the
- Go 1.22End of life · Feb 2025
- Each loop iteration gets its own variable (fixing a classic bug),
for i := range 10, method and wildcard routing innet/http
- Each loop iteration gets its own variable (fixing a classic bug),
- Go 1.21End of life · Aug 2024
- Built-ins
min,max,clear; theslices,mapsandlog/slogpackages; automatic toolchain downloads
- Built-ins
- Go 1.18End of life · Feb 2023
- Generics (type parameters), built-in fuzz testing, workspaces
- Go 1.16Historic
//go:embedto bundle files into the binary; modules on by default
- Go 1.13Historic
- Error wrapping with
%w,errors.Isanderrors.As
- Error wrapping with
- Go 1.11Historic
- Go modules (
go.mod) for dependency management, and a WebAssembly port
- Go modules (
- Go 1.5Historic
- The compiler and runtime rewritten in Go itself; a low-latency concurrent garbage collector
- Go 1.0Historic
- The first stable release and the Go 1 compatibility promise
- Go Open sourceHistoric
- Go is announced and released as an open-source project
How Go modernized
- Modules (1.11–1.16) replaced the old
GOPATHworkspace with versioned dependencies ingo.modand checksums ingo.sum. - Generics (1.18) were the biggest language change since 1.0, added after years of design work so they would fit Go's simplicity. Later releases extended them with generic type aliases (1.24) and generic methods (1.27).
- A richer standard library, with
slices,maps, structured logging withlog/slog(1.21), iterators (1.23) and JSON v2 (1.27). - Faster programs without code changes, from the concurrent GC (1.5) to profile-guided optimization (1.21), Swiss-table maps (1.24) and the Green Tea GC (1.26).
- Forward compatibility (1.21). The
goline ingo.modcan now download and use the right toolchain automatically.
Go before and after generics
| Task | Before Go 1.18 | Go 1.18 and later |
|---|---|---|
| A function for many types | One copy per type, or interface{} plus type assertions |
func Max[T cmp.Ordered](a, b T) T |
| Common slice helpers | Write your own loops | slices.Contains, slices.Sort, slices.Index |
| Typed containers | interface{} and casts |
type Stack[T any] struct { items []T } |
| Compile-time safety | Mistakes found at run time (bad casts) | Caught by the compiler |
Which version should you use?
- Always use one of the two supported releases (1.27 or 1.26 today). Thanks to the compatibility promise,
upgrading is usually just changing the
goline ingo.modand rebuilding. - This tutorial: examples are compiled and run with the Go toolchain when we build the lessons, and their real output is shown under each example. Go examples can't run in your browser.
Official resources
- go.dev, documentation and the language specification
- Release history with release notes for every version
- The Go 1 compatibility promise
- The Go blog and the history of the project in the Go FAQ
- Go release schedule on endoflife.date
Last reviewed 21 October 2026. Release and support dates come from the official release pages linked above.