← Back to all TILs

Produce The Zero Value For A Generic Type

go Written December 20, 2024

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)
}

Other posts like this