Generics in Go were added about a year back in Go 1.18. In my experience they are great and they fix one of the biggest roadblocks in terms of writing reusable code in Go. I’ll illustrate that with an example.
First, do ensure that you have at least Go 1.18
1
2
| $ go version
go version go1.19.1 darwin/amd64
|
Let’s consider a simple case of implementing a Map
function in Go that maps an array (well, a slice) to another array (again, actually, a slice).
First, let’s start with a non-generic implementation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| package main
import (
"fmt"
)
func Map(input []int, mapFunc func(int)int) []int {
output := make([]int, 0, len(input))
for _, val := range input {
output = append(output, mapFunc(val))
}
return output
}
func main() {
input := []int {1,2,3}
squared := func(x int) int {
return x * x
}
output := Map(input, squared)
fmt.Printf("%+v\n", output)
}
|
And now let’s generalize the Map
function, notice that, in most cases, the caller wouldn’t change at all.
1
2
3
4
5
6
7
8
9
| // A is the input type
// B is the output type
func Map[A any,B any](input []A, mapFunc func(A)B) []B {
output := make([]B, 0, len(input))
for _, val := range input {
output = append(output, mapFunc(val))
}
return output
}
|