在 Go 中返回泛型类型的默认值
在 Go 中,如何返回泛型类型 T 的默认值?考虑以下代码:
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 }
尝试编译此代码时,您可能会遇到错误:
cannot use nil as T value in return statement
返回 Nil 的问题
Go 中不允许为泛型类型返回 nil。这是因为 nil 并不是所有类型的有效值。例如,如果 T 是整数,则返回 nil 将毫无意义。同样,nil 也不是结构体的有效值。
返回零值
您应该返回用于的类型参数的零值,而不是返回 nil T. 指针和切片的零值为 nil,字符串的零值为空字符串,整数和浮点数的零值为 0
要返回零值,您可以声明 T 类型的变量并返回它:
func getZero[T any]() T { var result T return result }
测试零值函数
这是一个如何测试 getZero 的示例函数:
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) }
输出:
int 0 string "" image.Point {0, 0} *float64 <nil>
这表明 getZero 函数返回不同类型的预期零值。
以上是如何在 Go 中返回泛型类型的默认值?的详细内容。更多信息请关注PHP中文网其他相关文章!