While writing a pop function that would work with slices of a generic type, I
ran into the issue of needing to produce a zero value of type T
when
returning early for an empty slice.
The way to arbitrarily get the zero value of a generic in Go is with *new(T)
.
I was able to use this in my Pop
function like so:
func Pop[T any](slice []T) (T, error) {
if len(slice) == 0 {
return *new(T), fmt.Errorf("cannot pop an empty slice")
}
lastItem := slice[len(slice)-1]
slice = slice[:len(slice)-1]
return lastItem, nil
}
If this is happening in multiple functions and we want a more self-documenting
approach, we can pull it out into a function zero
:
func zero[T any]() T {
return *new(T)
}