akutz / go-generics-the-hard-way
- воскресенье, 23 января 2022 г. в 00:30:47
A hands-on approach to getting started with Go generics.
I started using Go back around 2015 and was immediately surprised by the lack of any type of generic type system. Sure, the empty interface{} existed, but that was hardly the same. At first I thought I wanted needed generics in Go, but over time I began appreciating the simplicity of the language. So when I learned of discussions to introduce generics in Go 2.0, I was ambivalent at best. Once the timetable to introduce generics was accelerated to Go 1.18, I decided it was time to take a closer look at the proposal.
After spending some time playing with them, I began to appreciate how generics in Go have been designed and implemented with the same elegance and simplicity as Go itself. I hope you will agree, and to that end, this repository is a hands-on approach to learning all about generics in Go.
T?any I keep seeing everywhere?~ do?While it is true that the Go playground uses the most recent, stable release of Go, there is also a Go playground that uses the tip at https://gotipplay.golang.org, and this playground supports generics.
T?The symbol T is often used when discussing generic types because T is the first letter of the word type. That is really all there is too it. Just like x or i are often the go-to variable names for loops, T is the go-to symbol for generic types.
For what is worth, K is often used when there is more than one generic type, ex. T, K.
any I keep seeing everywhere?The word any is a new, predeclared identifier and is equivalent to the empty interface in all ways. Simply put, writing and reading any is just more user friendly than interface{}
~ do?The ~ symbol is used to express that T may be satisfied by a defined or named type directly or by a type definition that has the same, underlying type as another defined or named type. To learn more about type constraints and the ~ symbol, please refer to the section Tilde ~.
Generics in Go are not implemented with type erasure. Please jump to Internals for more information.