# A Proposal for Adding Generics to Go
12 Jan 2021
Tags: go2, proposals, generics
Summary: Generics is entering the language change proposal process

Ian Lance Taylor

## Generics proposal

We’ve filed [a Go language change
proposal](https://golang.org/issue/43651) to add support for type
parameters for types and functions, permitting a form of generic
programming.

## Why generics?

Generics can give us powerful building blocks that let us share code
and build programs more easily.
Generic programming means writing functions and data structures where
some types are left to be specified later.
For example, you can write a function that operates on a slice of some
arbitrary data type, where the actual data type is only specified when
the function is called.
Or, you can define a data structure that stores values of any type,
where the actual type to be stored is specified when you create an
instance of the data structure.

Since Go was first released in 2009, support for generics has been one
of the most commonly requested language features.
You can read more about why generics are useful in 
[an earlier blog post](https://blog.golang.org/why-generics).

Although generics have clear use cases, fitting them cleanly into a
language like Go is a difficult task.
One of the [first (flawed) attempts to add generics to
Go](https://golang.org/design/15292/2010-06-type-functions) dates back
all the way to 2010.
There have been several others over the last decade.

For the last couple of years we’ve been working on a series of design
drafts that have culminated in [a design based on type
parameters](https://golang.org/design/go2draft-type-parameters).
This design draft has had a lot of input from the Go programming
community, and many people have experimented with it using the
[generics playground](https://go2goplay.golang.org) described in [an
earlier blog post](https://blog.golang.org/generics-next-step).
Ian Lance Taylor gave [a talk at GopherCon
2019](https://www.youtube.com/watch?v=WzgLqE-3IhY)
about why to add generics and the strategy we are now following.
Robert Griesemer gave [a follow-up talk about changes in the design,
and the implementation, at GopherCon
2020](https://www.youtube.com/watch?v=TborQFPY2IM).
The language changes are fully backward compatible, so existing Go
programs will continue to work exactly as they do today.
We have reached the point where we think that the design draft is good
enough, and simple enough, to propose adding it to Go.

## What happens now?

The [language change proposal process](https://golang.org/s/proposal)
is how we make changes to the Go language.
We have now [started this process](https://golang.org/issue/43651)
to add generics to a future version of Go.
We invite substantive criticisms and comments, but please try to avoid
repeating earlier comments, and please try to [avoid simple plus-one
and minus-one comments](https://golang.org/wiki/NoPlusOne).
Instead, add thumbs-up/thumbs-down emoji reactions to comments with
which you agree or disagree, or to the proposal as a whole.

As with all language change proposals, our goal is to drive toward a
consensus to either add generics to the language or let the proposal
drop.
We understand that for a change of this magnitude it will be
impossible to make everybody in the Go community happy, but we intend
to get to a decision that everybody is willing to accept.

If the proposal is accepted, our goal will be to have a complete,
though perhaps not fully optimized, implementation for people to try
by the end of the year, perhaps as part of the Go 1.18 betas.
