海印网
海印网

Golang泛型的定义与应用

admin数码170

go 1.18 中引入了泛型,可创建独立于类型的代码。泛型使用方括号 [] 定义类型参数,如 func sort[t any](arr []t)。go 编译器可以推断类型参数,如 func swap[t](x, y t)。泛型可用于构建数据结构,如二叉查找树 type node[t any] struct { … },并施加类型约束,如 type node[t comparable] struct { … }。go 泛型提高了代码的灵活性,而不产生新的类型。

Golang泛型的定义与应用-第1张图片-海印网

Go 泛型的定义和应用

在 Go 1.18 中,Go 语言引入了备受期待的功能:泛型。泛型允许您创建独立于具体类型的数据结构和算法,从而提高代码的可重用性和灵活性。

定义泛型

泛型使用方括号 [] 来定义,其中包含任意数量的类型参数:

func Sort[T any](arr []T)

登录后复制

在上面的示例中,T 是类型参数,代表可以是任何类型的项。

类型推断

如果函数的泛型类型参数可以在上下文中推断出来,则可以省略它们:

func Swap[T](x, y T)

登录后复制

此函数可以与任何类型的两个参数一起使用,Go 编译器会推断出 T 应该是 xy 的类型。

实战案例:二叉查找树

让我们创建一个二叉查找树的泛型版本:

type Node[T any] struct {
    Value    T
    Left     *Node[T]
    Right    *Node[T]
}

func Insert[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}

func Search[T comparable](n *Node[T], value T) *Node[T] {
    // ...
}

登录后复制

这个二叉查找树允许我们存储和搜索任何可比较类型的元素。

类型约束

有时,您需要对类型参数施加约束。例如,为了确保在二叉查找树中比较两个值是有效的,我们可以要求 T 实现了 comparable 接口:

type Node[T comparable] struct {
    // ...
}

登录后复制

注意事项

  • Go 中的泛型并非类型模板,它们不会产生新的类型。
  • 泛型类型参数不能被实例化。
  • 类型推断仅适用于调用函数时,而不适用于声明函数时。

结论

Go 泛型为 Go 语言带来了强大的新功能。了解如何定义和使用泛型是提高代码灵活性和可重用性的关键。

以上就是Golang泛型的定义与应用的详细内容,更多请关注其它相关文章!

Tags: 类型参数

Sorry, comments are temporarily closed!