Returning Default Values for Generic Types in Go
In Go, how can you return a default value for a generic type T? Consider the following code:
type mylist[T any] struct { first *node[T] } type node[T any] struct { data T next *node[T] } func (list *mylist[T]) pop() T { if list.first != nil { data := list.first.data list.first = list.first.next return data } return nil } func (list *mylist[T]) getfirst() T { if list.first != nil { return list.first.data } return nil }
When trying to compile this code, you may encounter the error:
cannot use nil as T value in return statement
The Issue of Returning Nil
Returning nil for a generic type is not allowed in Go. This is because nil is not a valid value for all types. For example, if T is an integer, returning nil would be meaningless. Similarly, nil is not a valid value for structs.
Returning the Zero Value
Instead of returning nil, you should return the zero value for the type argument used for T. The zero value is nil for pointers and slices, the empty string for strings, and 0 for integers and floating-point numbers.
To return the zero value, you can declare a variable of type T and return it:
func getZero[T any]() T { var result T return result }
Testing the Zero Value Function
Here's an example of how to test the getZero function:
package main import "fmt" func main() { i := getZero[int]() fmt.Printf("%T %v\n", i, i) s := getZero[string]() fmt.Printf("%T %q\n", s, s) p := getZero[image.Point]() fmt.Printf("%T %v\n", p, p) f := getZero[*float64]() fmt.Printf("%T %v\n", f, f) }
Output:
int 0 string "" image.Point {0, 0} *float64 <nil>
This shows that the getZero function returns the expected zero values for different types.
The above is the detailed content of How to Return Default Values for Generic Types in Go?. For more information, please follow other related articles on the PHP Chinese website!