|  | # 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. |